gpt4 book ai didi

java - 如何使我的 JComponent 符合 JFrame.pack 和布局管理器?

转载 作者:行者123 更新时间:2023-12-02 08:15:56 24 4
gpt4 key购买 nike

我制作了一个 JComponent,它显示指定颜色的矩形。 (还没有找到任何其他方法来达到这种效果)。问题是,它没有按预期遵循 JFrame.pack() 和布局管理器。

代码:

import java.awt.*;
import javax.swing.*;

public class FooRunnable implements Runnable{

private class ColorSample extends JComponent{

private Color sampleColor;
private int width, height;

public ColorSample(int rgb, int w, int h){
sampleColor = new Color(rgb);
width = w;
height = h;
}

public Dimension getSize(){
return new Dimension(width, height);
}

public int getWidth(){
return width;
}

public int getHeight(){
return height;
}

public boolean isDisplayable(){
return true;
}

public void paintComponent(Graphics g){
g.setColor(sampleColor);
g.fillRect(0, 0, width, height);
}

}

public void run(){
JFrame mainFrame = new JFrame();
//mainFrame.setSize(500, 300);
Container mainContent = mainFrame.getContentPane();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainContent.setLayout(new BoxLayout(mainContent, BoxLayout.PAGE_AXIS));

JPanel specifyFilePanel = new JPanel();
specifyFilePanel.setLayout(new BoxLayout(specifyFilePanel, BoxLayout.LINE_AXIS));
JLabel filenameLabel = new JLabel("File: ");
JButton browseButton = new JButton("Browse...");
specifyFilePanel.add(Box.createHorizontalStrut(8));
specifyFilePanel.add(filenameLabel);
specifyFilePanel.add(browseButton);
specifyFilePanel.add(Box.createHorizontalStrut(8));

JPanel colorStatusPanel = new JPanel();
colorStatusPanel.setLayout(new BoxLayout(colorStatusPanel, BoxLayout.Y_AXIS));
JLabel statusLabel = new JLabel("");
JButton roll = new JButton("Operate");
colorStatusPanel.add(new ColorSample(Color.red.getRGB(), 50, 100));
colorStatusPanel.add(statusLabel);
colorStatusPanel.add(roll);

mainContent.add(Box.createVerticalStrut(5));
mainContent.add(specifyFilePanel);
mainContent.add(Box.createVerticalStrut(10));
mainContent.add(colorStatusPanel);
mainContent.add(new JPanel());
mainFrame.pack();
mainFrame.setVisible(true);
}

}

我尝试在包和明确指定框架的大小之间进行试验。以下是我的 GUI 在各种设置下的默认外观:

普通 mainFrame.pack(): mainFrame.pack()

mainFrame.setSize(500, 500): enter image description here

mainFrame.setSize(500, 300): mainFrame.setSize(500, 300)

最接近我想要实现的目标是 mainFrame.setSize(500, 500),尽管我计划添加更多组件,但我预计它会很脆弱。正如您所看到的,在另外两个中,“操作”按钮与 ColorSample 组件重叠,就像它不遵循我设置的布局管理器一样。然后看看如何对 ColorSample 组件进行打包切割。关于如何达到我想要的效果有什么建议吗?

最佳答案

LayoutManager 可以按照他们认为合适的方式自由调整组件的大小/位置,组件不能强制它们,而只能在其 getXXSize (XX == min/pref/max) 方法中给出提示。因此,组件实现所能做的最好的事情就是

  • 实现所有 getXXSize 并返回他们理想想要的尺寸
  • 实现paintComponent来应对不同的尺寸

仅一个片段

public class MyBox extends JComponent {
Dimension boxSize;

public void setBoxSize(Dimension box) {
this.boxSize = new Dimension(box);
...
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// position the box in the actual size
// and paint it
}

@Override
public Dimension getPreferredSize() {
return getBoxSize();
}
@Override // same for min/max
public Dimension getM...Size( {
return getBoxSize();
}
}

关于java - 如何使我的 JComponent 符合 JFrame.pack 和布局管理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com