滚动条未出现在 java Swing 中
Scrollbars not appering in java Swing
在我的程序中,我向面板添加了一个标签、两个单选按钮、一个文本字段和提交按钮。我的单选按钮和提交按钮未以当前 window 大小显示,因为我已将它们的位置设置在 JFrame window 下方。但是 window 中没有出现滚动条。告诉我哪里错了。
这是我的代码
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;
class SwingForm extends JFrame
{
SwingForm()
{
super();
Container c=getContentPane();
c.setLayout(new BorderLayout());
JPanel p=new JPanel();
p.setLayout(null);
JLabel l=new JLabel("First Name");
l.setBounds(50, 50, 70, 20);
JTextField j=new JTextField();
j.setBounds(150, 50, 70, 20);
JRadioButton j1=new JRadioButton("Male");
j1.setBounds(50, 300, 70, 50);
JRadioButton j2=new JRadioButton("Female");
j2.setBounds(170, 300, 70, 50);
JButton b=new JButton("Submit");
b.setBounds(100, 600, 100, 100);
ButtonGroup bg=new ButtonGroup();
bg.add(j1);
bg.add(j2);
p.add(l);
p.add(j);
p.add(j1);
p.add(j2);
p.add(b);
int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jp=new JScrollPane(p,v,h);
c.add(jp,BorderLayout.CENTER);
setVisible(true);
setSize(300,300);
}
public static void main(String args[])
{
new SwingForm();
}
}
这是输出
p.setLayout(null);
是您的(最重要的问题)。 JScrollPane
将依赖其视图的 preferredSize
来确定何时应显示滚动条。
让它工作的最好方法是使用一个或多个合适的布局管理器,让 API 完成它的工作
下面的示例实际上使用了 3 个布局管理器,BorderLayout
(JFrame
的默认设置),FlowLayout
(JPanel
的默认设置)和GridBagLayout
有关详细信息,请参阅 Layout out components in a container
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JPanel p = new JPanel();
p.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
JLabel l = new JLabel("First Name");
p.add(l, gbc);
JTextField j = new JTextField(12);
gbc.gridx++;
p.add(j, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
JRadioButton j1 = new JRadioButton("Male");
JRadioButton j2 = new JRadioButton("Female");
ButtonGroup bg = new ButtonGroup();
bg.add(j1);
bg.add(j2);
JPanel buttons = new JPanel();
buttons.add(j1);
buttons.add(j2);
p.add(buttons, gbc);
gbc.gridy++;
gbc.insets = new Insets(100, 0, 0, 0);
JButton b = new JButton("Submit");
p.add(b, gbc);
JScrollPane jp = new JScrollPane(p);
frame.add(jp, BorderLayout.CENTER);
//frame.pack();
// This is just to force the point
frame.setSize(250, 100);
frame.setVisible(true);
}
});
}
}
在我的程序中,我向面板添加了一个标签、两个单选按钮、一个文本字段和提交按钮。我的单选按钮和提交按钮未以当前 window 大小显示,因为我已将它们的位置设置在 JFrame window 下方。但是 window 中没有出现滚动条。告诉我哪里错了。
这是我的代码
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;
class SwingForm extends JFrame
{
SwingForm()
{
super();
Container c=getContentPane();
c.setLayout(new BorderLayout());
JPanel p=new JPanel();
p.setLayout(null);
JLabel l=new JLabel("First Name");
l.setBounds(50, 50, 70, 20);
JTextField j=new JTextField();
j.setBounds(150, 50, 70, 20);
JRadioButton j1=new JRadioButton("Male");
j1.setBounds(50, 300, 70, 50);
JRadioButton j2=new JRadioButton("Female");
j2.setBounds(170, 300, 70, 50);
JButton b=new JButton("Submit");
b.setBounds(100, 600, 100, 100);
ButtonGroup bg=new ButtonGroup();
bg.add(j1);
bg.add(j2);
p.add(l);
p.add(j);
p.add(j1);
p.add(j2);
p.add(b);
int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jp=new JScrollPane(p,v,h);
c.add(jp,BorderLayout.CENTER);
setVisible(true);
setSize(300,300);
}
public static void main(String args[])
{
new SwingForm();
}
}
这是输出
p.setLayout(null);
是您的(最重要的问题)。 JScrollPane
将依赖其视图的 preferredSize
来确定何时应显示滚动条。
让它工作的最好方法是使用一个或多个合适的布局管理器,让 API 完成它的工作
下面的示例实际上使用了 3 个布局管理器,BorderLayout
(JFrame
的默认设置),FlowLayout
(JPanel
的默认设置)和GridBagLayout
有关详细信息,请参阅 Layout out components in a container
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JPanel p = new JPanel();
p.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
JLabel l = new JLabel("First Name");
p.add(l, gbc);
JTextField j = new JTextField(12);
gbc.gridx++;
p.add(j, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
JRadioButton j1 = new JRadioButton("Male");
JRadioButton j2 = new JRadioButton("Female");
ButtonGroup bg = new ButtonGroup();
bg.add(j1);
bg.add(j2);
JPanel buttons = new JPanel();
buttons.add(j1);
buttons.add(j2);
p.add(buttons, gbc);
gbc.gridy++;
gbc.insets = new Insets(100, 0, 0, 0);
JButton b = new JButton("Submit");
p.add(b, gbc);
JScrollPane jp = new JScrollPane(p);
frame.add(jp, BorderLayout.CENTER);
//frame.pack();
// This is just to force the point
frame.setSize(250, 100);
frame.setVisible(true);
}
});
}
}