0

我对 Swing 有点陌生,我正在尝试如何使用空布局放置组件。这是一个程序,其中按钮 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);

}
}
4

2 回答 2

3

我只想滚动以使按钮 b3 完全可见。

doesn't work使用空布局时滚动。这就是为什么你不应该使用空布局。

Swing 旨在与布局管理器一起使用。当您使用布局管理器时,滚动将自动工作。

于 2013-11-21T17:23:47.923 回答
3

我不想更改其他组件的绝对位置(空布局)。

我强烈敦促你摆脱这个限制。这样做并以智能的方式使用适当的布局管理器,滚动会很容易。

否则,如果您绝对必须使用空布局(我怀疑您这样做),请考虑创建您自己的 JPanel 派生类来实现 Scrollable 接口,但这将需要更多的工作并且通常会有更多的错误。


另外,请注意上面的主要方法将不起作用,因为它缺少String[] args参数。

编辑 2:您的代码还有很多错误,包括向容器多次添加组件,以及其他奇怪的事情。你读过 Swing 教程吗?如果没有,请检查它们,因为它们将无休止地帮助您。


编辑 2
另请注意,对于 JScrollPane 来“滚动”作为其视口视图的组件,这里您的 JPanel 必须大于该视图。

例如,我可以通过将主 JPanel 的首选大小设置为大于 JScrollPane 的大小来使您的主 JPanel“可滚动”(请原谅我 kleopatra)。请注意,您的代码中有很多我不建议这样做的地方,设置边界首选尺寸是其中的两个,但发布此内容是为了表明首选尺寸很重要。我还摆脱了 JFrame 的空布局,并在显示之前打包了 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);

   }
}
于 2013-11-21T17:24:18.103 回答