我是Swing的新手,我正在尝试如何使用null布局放置组件。 这是一个程序,按钮b3(朝向末端)在面板pan1内部变成一半而一半是不可见的。
我添加了一个滚动窗格来取pan1,滚动窗格似乎在那里,但它不会滚动。有没有办法滚动,以便我可以查看完整按钮?
我不想更改其他组件的绝对位置(空布局)。我只想滚动以便按钮b3完全在视图中。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Swing18
{
public static void main()
{
JFrame frame1 = new JFrame("TESTING");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setSize(1000,700);
frame1.setLocation(200,100);
frame1.setResizable(false);
frame1.setLayout(null);
JPanel pan1 = new JPanel();
pan1.setBackground(Color.green);
pan1.setBounds(0,0,900,600);
frame1.add(pan1);
pan1.setLayout(null);
JButton east = new JButton("East");
JButton west = new JButton("West");
JButton north = new JButton("North");
JButton south = new JButton("South");
Color cr1 = new Color(0,127,0);
Font ft1 =new Font("impact",Font.BOLD,25);
north.setForeground(Color.white);
north.setBackground(cr1);
south.setForeground(Color.white);
south.setBackground(cr1);
east.setForeground(Color.white);
east.setBackground(Color.blue);
east.setFont(ft1);
east.setToolTipText(" This is the EAST zone");
west.setForeground(Color.white);
west.setBackground(Color.blue);
west.setFont(ft1);
west.setToolTipText(" This is the WEST zone");
JLabel lb1 = new JLabel(" Label 1 ");
JLabel lb2 = new JLabel(" Label 2 ");
lb2.setOpaque(true);
lb2.setForeground(Color.white);
lb2.setBackground(Color.black);
lb2.setFont(ft1);
JTextField tf1 =new JTextField(" TextField1");
tf1.setForeground(Color.white);
tf1.setBackground(Color.black);
tf1.setFont(ft1);
JTextField tf2 =new JTextField("TextField 2");
JTextArea ta1= new JTextArea("Enter TA",5,30);
ta1.setForeground(Color.white);
ta1.setBackground(Color.black);
ta1.setFont(ft1);
ta1.setLineWrap(true);
JSlider sd1 = new JSlider(50,150);
sd1.setMajorTickSpacing(20);
sd1.setMinorTickSpacing(10);
sd1.setPaintTicks(true);//essential for visible ticks
sd1.setPaintLabels(true);//essential for visible numbers
sd1.setForeground(Color.white);
sd1.setBackground(Color.black);
JSlider sd2 = new JSlider(JSlider.VERTICAL,50,200,100);
sd2.setMajorTickSpacing(25);
sd2.setMinorTickSpacing(5);
sd2.setPaintTicks(true);
sd2.setPaintLabels(true);
JSlider sd3 = new JSlider(JSlider.HORIZONTAL,50,200,100);
sd3.setMajorTickSpacing(25);
sd3.setMinorTickSpacing(5);
String[] fruit = {"Apple","Banana"," Coconut"," Date","Jujube","Guava","Grapes","Mango","Orange","Water Melon","Very Long Named Fruit"};
JList lt1 = new JList(fruit);
lt1.setForeground(Color.white);
lt1.setBackground(Color.black);
String[] country = {"Armenia","Bangladesh","China","Denmark","Egypt","France","Germany","Holland","India","Japan","Kyrgystan"," Lithuania","Mexico","North Korea","Singapore","Uruguay","Vanuatu"/*,"Very Big Named Country"*/};
JComboBox cb1 = new JComboBox(country);
cb1.setForeground(Color.yellow);
cb1.setBackground(Color.red);
cb1.setFont(ft1);
ButtonGroup bg1= new ButtonGroup();
JRadioButton rb1 = new JRadioButton(" Rose ");
rb1.setForeground(Color.cyan);
rb1.setBackground(cr1);
bg1.add(rb1);
JRadioButton rb2 = new JRadioButton(" Lily ");
rb2.setForeground(Color.cyan);
rb2.setBackground(cr1);
bg1.add(rb2);
JRadioButton rb3 = new JRadioButton(" Tulip ");
rb3.setForeground(Color.cyan);
rb3.setBackground(cr1);
bg1.add(rb3);
JRadioButton rb4 = new JRadioButton(" SunFlower ");
rb4.setForeground(Color.cyan);
rb4.setBackground(cr1);
bg1.add(rb4);
JCheckBox ch1 = new JCheckBox(" See ");
ch1.setForeground(Color.magenta);
ch1.setBackground(Color.cyan);
bg1.add(ch1);
JCheckBox ch2 = new JCheckBox(" Touch ");
ch2.setForeground(Color.magenta);
ch2.setBackground(Color.cyan);
bg1.add(ch2);
JCheckBox ch3 = new JCheckBox(" Smell ");
ch3.setForeground(Color.magenta);
ch3.setBackground(Color.cyan);
bg1.add(ch3);
east.setBounds(400,200,80,100);
pan1.add(east);
west.setBounds(20,200,80,100);
pan1.add(west);
north.setBounds(200,10,100,80);
pan1.add(north);
south.setBounds(200,510,100,80);
pan1.add(south);
lb1.setBounds(0,0,100,50);
pan1.add(lb1);
lb2.setBounds(0,80,100,50);
pan1.add(lb2);
tf1.setBounds(10,350,80,30);
pan1.add(tf1);
tf2.setBounds(10,500,80,30);
pan1.add(tf2);
ta1.setBounds(400,10,100,180);
pan1.add(ta1);
sd1.setBounds(140,120,200,50);
pan1.add(sd1);
sd2.setBounds(210,200,50,200);
pan1.add(sd2);
sd3.setBounds(140,410,200,50);
pan1.add(sd3);
lt1.setBounds(520,20,120,200);
pan1.add(lt1);
cb1.setBounds(520,310,180,50);
pan1.add(cb1);
JScrollPane sp1 = new JScrollPane(lt1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp1.setBounds(lt1.getX(),lt1.getY(),lt1.getWidth(),lt1.getHeight());
pan1.add(sp1);
JScrollPane sp2 = new JScrollPane(cb1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp2.setBounds(cb1.getX(),cb1.getY(),cb1.getWidth(),cb1.getHeight());
pan1.add(sp2);
JScrollPane sp3 = new JScrollPane(ta1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp3.setBounds(ta1.getX(),ta1.getY(),ta1.getWidth()+10,ta1.getHeight()+10);
pan1.add(sp3);
JScrollPane sp4 = new JScrollPane(sd3,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp4.setBounds(sd3.getX(),sd3.getY(),sd3.getWidth(),sd3.getHeight());
pan1.add(sp4);
JScrollPane sp5 = new JScrollPane(tf1,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp5.setBounds(tf1.getX(),tf1.getY(),tf1.getWidth()+20,tf1.getHeight()+20);//20,20 seems the ideal width and height to add
pan1.add(sp5);
//Now we try scrollpane on a panel
JScrollPane sp6 = new JScrollPane(pan1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp6.setBounds(pan1.getX(),pan1.getY(),pan1.getWidth()+20,pan1.getHeight()+20);
frame1.add(sp6);
JPanel pan2 = new JPanel();
pan2.setBackground(Color.red);
pan2.setBounds(680,10,120,250);
pan1.add(pan2);
pan2.setLayout(new BoxLayout(pan2,BoxLayout.Y_AXIS));
pan2.add(rb1);
pan2.add(rb2);
pan2.add(rb3);
pan2.add(rb4);
pan2.add(ch1);
pan2.add(ch2);
pan2.add(ch3);
**JButton b3 = new JButton("A Very Big Button");**
b3.setBackground(Color.white);
b3.setBounds(850,40,120,50);
pan1.add(b3);
/*
*/
frame1.setVisible(true);
}
}
答案 0 :(得分:3)
我只想滚动以便按钮b3完全在视图中。
使用空布局时滚动doesn't work
。这就是为什么你不应该使用空布局。
Swing旨在与布局管理器一起使用。当您使用布局管理器时,滚动将自动运行。
答案 1 :(得分:3)
我不想改变其他组件的绝对位置(空布局)。
我强烈建议你摆脱这种限制。这样做并以智能方式使用适当的布局管理器,滚动将很容易。
否则,如果你绝对必须使用null布局(我怀疑你这样做),考虑创建你自己的JPanel派生类来实现一个Scrollable接口,但是这将会有更多的工作,而且往往会有更多的bug。
另外请注意,上面的主要方法无效,因为它缺少String[] args
参数。
编辑2:你的代码有很多错误,包括多次向容器添加组件,以及其他奇怪的事情。你有没有经历过Swing教程?如果没有,请检查它们,因为它们将帮助您永无止境。
编辑2
另请注意,对于JScrollPane来“滚动”作为视口视图保持的组件,这里的JPanel必须大于该视图。
例如,我可以通过将其首选大小设置为大于JScrollPane(请原谅我kleopatra)来使主JPanel“可滚动”。请注意,您的代码中有很多我不建议这样做,并且设置边界和首选大小是其中两个,但是这是为了显示首选大小很重要。我还摆脱了JFrame的null布局,并在显示之前打包了JFrame:
import javax.swing.*;
import java.awt.*;
public class Swing18 {
private static final Dimension PAN1_DIM = new Dimension(1000, 800);
private static final Dimension SP6_DIM = new Dimension(700, 500);
// **** note that the main method needs parameters!! ****
public static void main(String[] args) {
JFrame frame1 = new JFrame("TESTING");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame1.setSize(1000, 700);
// frame1.setLocation(200, 100);
// frame1.setResizable(false);
// frame1.setLayout(null);
JPanel pan1 = new JPanel();
pan1.setBackground(Color.green);
// pan1.setBounds(0, 0, 900, 600);
pan1.setPreferredSize(PAN1_DIM);
// frame1.add(pan1);
pan1.setLayout(null);
JButton east = new JButton("East");
JButton west = new JButton("West");
JButton north = new JButton("North");
JButton south = new JButton("South");
Color cr1 = new Color(0, 127, 0);
Font ft1 = new Font("impact", Font.BOLD, 25);
north.setForeground(Color.white);
north.setBackground(cr1);
south.setForeground(Color.white);
south.setBackground(cr1);
east.setForeground(Color.white);
east.setBackground(Color.blue);
east.setFont(ft1);
east.setToolTipText(" This is the EAST zone");
west.setForeground(Color.white);
west.setBackground(Color.blue);
west.setFont(ft1);
west.setToolTipText(" This is the WEST zone");
JLabel lb1 = new JLabel(" Label 1 ");
JLabel lb2 = new JLabel(" Label 2 ");
lb2.setOpaque(true);
lb2.setForeground(Color.white);
lb2.setBackground(Color.black);
lb2.setFont(ft1);
JTextField tf1 = new JTextField(" TextField1");
tf1.setForeground(Color.white);
tf1.setBackground(Color.black);
tf1.setFont(ft1);
JTextField tf2 = new JTextField("TextField 2");
JTextArea ta1 = new JTextArea("Enter TA", 5, 30);
ta1.setForeground(Color.white);
ta1.setBackground(Color.black);
ta1.setFont(ft1);
ta1.setLineWrap(true);
JSlider sd1 = new JSlider(50, 150);
sd1.setMajorTickSpacing(20);
sd1.setMinorTickSpacing(10);
sd1.setPaintTicks(true);// essential for visible ticks
sd1.setPaintLabels(true);// essential for visible numbers
sd1.setForeground(Color.white);
sd1.setBackground(Color.black);
JSlider sd2 = new JSlider(JSlider.VERTICAL, 50, 200, 100);
sd2.setMajorTickSpacing(25);
sd2.setMinorTickSpacing(5);
sd2.setPaintTicks(true);
sd2.setPaintLabels(true);
JSlider sd3 = new JSlider(JSlider.HORIZONTAL, 50, 200, 100);
sd3.setMajorTickSpacing(25);
sd3.setMinorTickSpacing(5);
String[] fruit = { "Apple", "Banana", " Coconut", " Date", "Jujube",
"Guava", "Grapes", "Mango", "Orange", "Water Melon",
"Very Long Named Fruit" };
JList lt1 = new JList(fruit);
lt1.setForeground(Color.white);
lt1.setBackground(Color.black);
String[] country = { "Armenia", "Bangladesh", "China", "Denmark",
"Egypt", "France", "Germany", "Holland", "India", "Japan",
"Kyrgystan", " Lithuania", "Mexico", "North Korea", "Singapore",
"Uruguay", "Vanuatu"/* ,"Very Big Named Country" */};
JComboBox cb1 = new JComboBox(country);
cb1.setForeground(Color.yellow);
cb1.setBackground(Color.red);
cb1.setFont(ft1);
ButtonGroup bg1 = new ButtonGroup();
JRadioButton rb1 = new JRadioButton(" Rose ");
rb1.setForeground(Color.cyan);
rb1.setBackground(cr1);
bg1.add(rb1);
JRadioButton rb2 = new JRadioButton(" Lily ");
rb2.setForeground(Color.cyan);
rb2.setBackground(cr1);
bg1.add(rb2);
JRadioButton rb3 = new JRadioButton(" Tulip ");
rb3.setForeground(Color.cyan);
rb3.setBackground(cr1);
bg1.add(rb3);
JRadioButton rb4 = new JRadioButton(" SunFlower ");
rb4.setForeground(Color.cyan);
rb4.setBackground(cr1);
bg1.add(rb4);
JCheckBox ch1 = new JCheckBox(" See ");
ch1.setForeground(Color.magenta);
ch1.setBackground(Color.cyan);
bg1.add(ch1);
JCheckBox ch2 = new JCheckBox(" Touch ");
ch2.setForeground(Color.magenta);
ch2.setBackground(Color.cyan);
bg1.add(ch2);
JCheckBox ch3 = new JCheckBox(" Smell ");
ch3.setForeground(Color.magenta);
ch3.setBackground(Color.cyan);
bg1.add(ch3);
east.setBounds(400, 200, 80, 100);
pan1.add(east);
west.setBounds(20, 200, 80, 100);
pan1.add(west);
north.setBounds(200, 10, 100, 80);
pan1.add(north);
south.setBounds(200, 510, 100, 80);
pan1.add(south);
lb1.setBounds(0, 0, 100, 50);
pan1.add(lb1);
lb2.setBounds(0, 80, 100, 50);
pan1.add(lb2);
tf1.setBounds(10, 350, 80, 30);
pan1.add(tf1);
tf2.setBounds(10, 500, 80, 30);
pan1.add(tf2);
ta1.setBounds(400, 10, 100, 180);
pan1.add(ta1);
sd1.setBounds(140, 120, 200, 50);
pan1.add(sd1);
sd2.setBounds(210, 200, 50, 200);
pan1.add(sd2);
sd3.setBounds(140, 410, 200, 50);
pan1.add(sd3);
lt1.setBounds(520, 20, 120, 200);
pan1.add(lt1);
cb1.setBounds(520, 310, 180, 50);
pan1.add(cb1);
JScrollPane sp1 = new JScrollPane(lt1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp1.setBounds(lt1.getX(), lt1.getY(), lt1.getWidth(), lt1.getHeight());
pan1.add(sp1);
JScrollPane sp2 = new JScrollPane(cb1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp2.setBounds(cb1.getX(), cb1.getY(), cb1.getWidth(), cb1.getHeight());
pan1.add(sp2);
JScrollPane sp3 = new JScrollPane(ta1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp3.setBounds(ta1.getX(), ta1.getY(), ta1.getWidth() + 10,
ta1.getHeight() + 10);
pan1.add(sp3);
JScrollPane sp4 = new JScrollPane(sd3,
JScrollPane.VERTICAL_SCROLLBAR_NEVER,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp4.setBounds(sd3.getX(), sd3.getY(), sd3.getWidth(), sd3.getHeight());
pan1.add(sp4);
JScrollPane sp5 = new JScrollPane(tf1,
JScrollPane.VERTICAL_SCROLLBAR_NEVER,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp5.setBounds(tf1.getX(), tf1.getY(), tf1.getWidth() + 20,
tf1.getHeight() + 20);// 20,20 seems the ideal width and height to
// add
pan1.add(sp5);
// Now we try scrollpane on a panel
JScrollPane sp6 = new JScrollPane(pan1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
// sp6.setBounds(pan1.getX(), pan1.getY(), pan1.getWidth() + 20,
// pan1.getHeight() + 20);
sp6.setPreferredSize(SP6_DIM);
frame1.add(sp6);
JPanel pan2 = new JPanel();
pan2.setBackground(Color.red);
pan2.setBounds(680, 10, 120, 250);
pan1.add(pan2);
pan2.setLayout(new BoxLayout(pan2, BoxLayout.Y_AXIS));
pan2.add(rb1);
pan2.add(rb2);
pan2.add(rb3);
pan2.add(rb4);
pan2.add(ch1);
pan2.add(ch2);
pan2.add(ch3);
JButton b3 = new JButton("A Very Big Button"); // !!
b3.setBackground(Color.white);
b3.setBounds(850, 40, 120, 50);
pan1.add(b3);
frame1.pack();
frame1.setLocationRelativeTo(null);
frame1.setVisible(true);
}
}