Java Swing按钮定位

时间:2015-04-10 18:38:42

标签: java swing awt jbutton layout-manager

这里的情况如下:我有一个JFrame,我存储了一个图像列表。按下右键时,我会在此全屏JFrame中显示下一个图像。我想在屏幕的右上角有一个退出JButton,这就是问题所在。为了实现这一点,我每次更改图像时都会创建一个新的JPanel,从框架中删除旧的JPanel,并将JButton添加到新的JPanel中。问题如下:当我启动程序时,JButton位于JF​​rame的中间。一旦我按下右键加载下一个图像,JButton就在正确的位置。但是,调用方法显示下一个图像的变通方法失败。即使我将JButton设置为不可见,直到按下右键并加载第二个图像,它仍然位于屏幕的中心而不是右上角。使用以下代码:

BufferedImage image = ImageIO.read(images.get(number));
JPanel panel = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
};
if (currentPanel != null) {
    this.remove(currentPanel);
}
panel.setSize(Gallery.this.getSize());
currentPanel = this.add(panel);
jButton1.setBounds(Gallery.this.getWidth() - jButton1.getWidth(), 0, jButton1.getWidth(), jButton1.getHeight());
panel.add(jButton1);
currentPanel.repaint();

此代码在启动时执行一次。那时JButton就在中间。 加载下一个图像时再次执行,现在JButton处于正确的位置。

我已经尝试了很多东西,比如将JButton添加到JFrame,将JPanels布局设置为null(使按钮不可见),重绘,打包,无效,我尝试的任何东西似乎都无效。是否有人能够指示Swing将JButton放在我的JFrame的右上角?非常感谢你!

1 个答案:

答案 0 :(得分:0)

清理完我在那里编程的烂摊子后,一个简单的解决方案证明可行: 我在启动时向JFrame添加了一个自定义JPanel,并为JButton设置了固定宽度。在这里JPanel:

public class ImagePanel extends javax.swing.JPanel {
Image image;

public Image getImage() {
    return image;
}

public void setImage(Image image) {
    this.image = image;
}

public ImagePanel() {
    initComponents();
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
}                  

}

我为JButton设置了固定宽度并将其添加到JPanel:

    jButton1 = new JButton();
    jButton1.setText("Exit");
    imagePanel = new ImagePanel();
    imagePanel.setSize(Gallery.this.getSize());
    add(imagePanel);
    imagePanel.add(jButton1);
    jButton1.setBounds(Gallery.this.getWidth() - 50, 0, 50, 30);
    jButton1.addActionListener((ActionEvent e) -> exit());
    displayImage(0);

displayImage方法由以下几行组成:

 BufferedImage image = ImageIO.read(images.get(number));
 imagePanel.setImage(image);
 imagePanel.repaint();