任何人都可以指出我在这个java swing gui代码出错的地方。我试图将两个按钮添加到JPanel,然后在设置大小后将其添加到框架中,但它似乎没有响应传递给它的setSize
值
public Test() {
GridLayout layout = new GridLayout(1, 2);
//this.setLayout(layout);
this.setSize(700, 700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buttonPanel = new JPanel();
buttonPanel.setSize(new Dimension(30, 100));
JButton rectButton = new JButton("Rectangle");
JButton ovalButton = new JButton("Oval");
buttonPanel.add(rectButton);
buttonPanel.add(ovalButton);
this.add(buttonPanel);
this.add(new PaintSurface());
this.setVisible(true);
}
答案 0 :(得分:6)
这可能无法回答您的直接问题......但是......
GridLayout layout = new GridLayout(1, 2);
this.setLayout(layout);
// You're original code...
// Why are you using `BorderLayout.CENTER` on a `GridLayout`
this.add(new PaintSurface(), BorderLayout.CENTER);
您将布局设置为GridLayout
,但是您使用BorderLayout
约束来应用其中一个组件?
另外,请确保代码中没有Test#pack
其他地方的电话,因为这会覆盖setSize
更新(根据提问更改)
请注意,JFrame
的默认布局管理器为BorderLayout
,因此即使您正在调用buttonPanel.setSize
,它也可能会被布局管理器覆盖。
我会仔细阅读A Visual Guide to Layout Managers和Using Layout Managers,以找到最符合您要求的布局管理器。
如果找不到一个,请考虑使用具有不同布局管理器的复合组件,使布局更接近您想要实现的目标。
答案 1 :(得分:1)
根据您更新的答案,您没有在任何设置上设置布局。
无论如何,如果你使用LayoutManager(你应该这样做),调用setSize()/setBounds()/setLocation()
是没有意义的,因为它将被LayoutManager覆盖(实际上是它的工作)。
并且猜测您的Test
类扩展JFrame
,通过调用this.add(buttonPanel); this.add(new PaintSurface());
您添加了两个具有相同约束的组件(BorderLayout.CENTER
,因为BorderLayout
是内容窗格的JFrame
内容窗格的默认LayoutManager。
仅仅是为了获取信息,虽然远非完美,但这显示了一些“有效”的东西:
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test extends JFrame {
private JPanel buttonPanel;
public class PaintSurface extends JButton {
public PaintSurface() {
super("Paint surface dummy");
}
}
public Test() {
GridLayout layout = new GridLayout(1, 2);
this.setLayout(layout);
this.setSize(700, 700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buttonPanel = new JPanel();
buttonPanel.setSize(new Dimension(30, 100));
JButton rectButton = new JButton("Rectangle");
JButton ovalButton = new JButton("Oval");
buttonPanel.add(rectButton);
buttonPanel.add(ovalButton);
this.add(buttonPanel);
this.add(new PaintSurface());
this.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
}
答案 2 :(得分:1)
好的,我会给你一个解决方案:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Cobie extends JFrame{
JButton rectButton = new JButton("Rectangle");
JButton ovalButton = new JButton("Oval");
JPanel buttonPanel = new JPanel();
JPanel paintSurface = new JPanel();
public Cobie(){
setLayout(new GridLayout(2,1));
buttonPanel.setBackground(Color.RED);
paintSurface.setBackground(Color.BLUE);
buttonPanel.add(rectButton);
buttonPanel.add(ovalButton);
add(buttonPanel);
add(paintSurface);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
Cobie c = new Cobie();
c.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
c.setSize(600,400); //Avoid using this method
c.setVisible(true);
}
});
}
}