Java 带SpringLayout的JPanel上的JButton不可见
我有一个JPanel,包含另一个JPanel,我使用SpringLayout在上面放置一个JButton。但是由于某些原因,JButton没有被绘制。 但是,如果使用绝对定位而不是布局管理器,则会绘制JButton。 如果我在设置SpringLayout的约束后打印出JButton的边界,我将得到宽度和高度为0的位置(0,0)。 通过手动设置JButton的大小(调用setSize()),我可以将JButton绘制为正确的大小,但不能绘制在正确的位置 这是迄今为止我的代码的精简版本:Java 带SpringLayout的JPanel上的JButton不可见,java,swing,springlayout,Java,Swing,Springlayout,我有一个JPanel,包含另一个JPanel,我使用SpringLayout在上面放置一个JButton。但是由于某些原因,JButton没有被绘制。 但是,如果使用绝对定位而不是布局管理器,则会绘制JButton。 如果我在设置SpringLayout的约束后打印出JButton的边界,我将得到宽度和高度为0的位置(0,0)。 通过手动设置JButton的大小(调用setSize()),我可以将JButton绘制为正确的大小,但不能绘制在正确的位置 这是迄今为止我的代码的精简版本: impor
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
public class Panel extends JPanel {
private JPanel innerPanel;
public Panel(){
innerPanel = new InnerPanel();
this.setLayout(null);
innerPanel.setBounds(30, 30, 100, 200);
this.add(innerPanel);
this.setOpaque(false);
}
public class InnerPanel extends JPanel {
private SpringLayout layout;
private JButton someButton;
public InnerPanel() {
layout = new SpringLayout();
this.setLayout(layout);
someButton = new JButton("X");
someButton.setPreferredSize(new Dimension(45, 25));
layout.putConstraint(SpringLayout.NORTH, someButton, +5, SpringLayout.NORTH, innerPanel);
layout.putConstraint(SpringLayout.EAST, someButton, -5, SpringLayout.EAST, innerPanel);
this.add(someButton);
this.setOpaque(false);
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.add(new Panel());
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
仅在JPanel上放置一个JButton的SpringLayout似乎有点过于复杂,但我计划向JPanel添加更多组件,为此我需要SpringLayout
我正在使用Eclipse(没有窗口生成器),如果这很重要的话,我正在运行OpenSuse。在
innerPanel
的构造函数中,innerPanel
变量显然是null
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Panel2 extends JPanel {
private JPanel innerPanel;
public Panel2() {
super(new BorderLayout());
innerPanel = new InnerPanel();
//this.setLayout(null);
//innerPanel.setBounds(30, 30, 100, 200);
this.add(innerPanel);
this.setOpaque(false);
}
private /* TEST static */ class InnerPanel extends JPanel {
private SpringLayout layout;
private JButton someButton;
public InnerPanel() {
super();
layout = new SpringLayout();
this.setLayout(layout);
someButton = new JButton("X");
//someButton.setPreferredSize(new Dimension(45, 25));
System.out.println(innerPanel); //TEST
//layout.putConstraint(SpringLayout.NORTH, someButton, +5, SpringLayout.NORTH, innerPanel);
//layout.putConstraint(SpringLayout.EAST, someButton, -5, SpringLayout.EAST, innerPanel);
layout.putConstraint(SpringLayout.NORTH, someButton, +5, SpringLayout.NORTH, this);
layout.putConstraint(SpringLayout.EAST, someButton, -5, SpringLayout.EAST, this);
this.add(someButton);
this.setOpaque(false);
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.add(new Panel2());
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
我需要SpringLayout。
-您永远不会被迫使用单个LayoutManager。通常,对于更复杂的布局,您可以创建多个面板,每个面板使用适当的LayoutManager,然后将所有面板组合到一个布局中。我从来没有使用过SpringLayout,因为我觉得它太让人困惑了。我已经在使用多个面板和不同的LayoutManager。对于这个,我认为SpringLayout最适合。除此之外,SpringLayout是我最熟悉的一个,它肯定是我犯过的错误之一。它修复了我的示例代码。但即使有了这个修复,我的实际代码中的JButton也不会被绘制出来。我的代码中似乎有更多的错误。但不管怎样,这缩小了范围。我发现了另一个问题。问题是,在调用setVisible()之后,我将JPanel添加到了周围的容器中。解决方案是在添加JPanel后调用revalidate()。