【问题标题】:Set JLabel location inside JPanel thats inside JFrame在 JFrame 内的 JPanel 内设置 JLabel 位置
【发布时间】:2015-08-01 09:30:06
【问题描述】:

我有一个用 JPanel 填充的 JFrame(代码如下)。
我正在使用 JPanel 在其中绘制东西,例如,我可以在任何我喜欢的地方画线,但是当向它添加 JLabel 时,我无法将它移动到它像this 线程一样卡在顶部中心的任何地方。
但问题是他们建议的解决方案对我不起作用。
我尝试添加:

 getContentPane().setLayout(null);

抱歉,如果我不清楚,我尝试在创建 Surface 之前和之后在函数 initUI() 中添加上述内容。
但在那之后,框架显示几乎 (1,1) 大小并且它是空的(如果我使用鼠标拖动手动调整它的大小)。

这是我的代码:
WaveDrawerMain 类

public class WaveDrawerMain extends JFrame {

private static WaveDrawerMain wd;
private Surface s;
public WaveDrawerMain() {
    initUI();
    s.drawLinexxx();
}
private void initUI() {

    setupMenu();
    s = new Surface(1200, 300); 
    add(s);
    setTitle("Waves");
    setSize(1200, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
}
private static void constructDrawer() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            wd = new WaveDrawerMain();
            wd.setVisible(true);
        }
    });
}
public static WaveDrawerMain createDrawer(){
    constructDrawer();
    idPool = new IntPool(100);
    lines = new LinesManager();
    return wd;
}
}

表面类

class Surface extends JPanel {

private ArrayList<Integer> points = new ArrayList<Integer>();
private int pWidth, pHeight;
@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);
    doDrawing(g);

}
@Override
public Dimension getPreferredSize() {
    return new Dimension(pWidth, pHeight);
}

public Surface(int width, int height) {
    pWidth = width;
    pHeight = height;


}

private void doDrawing(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

    g2d.drawLine(30, 30, 200, 30);
    for(int i = 0;i<points.size();i++){
        g2d.drawLine(points.get(i), 100, points.get(i)+50, 100+50);
    }
}

public void drawLinexxx(){
    points.add(600);
    JLabel lab1 = new JLabel("Test x "+Float.toString(getSize().width/3)+" y "+Float.toString(getSize().height/3));
    lab1.setLocation(getSize().width/3, getSize().height/3);

    add(lab1);
    repaint();
}
}

【问题讨论】:

    标签: java swing jframe jpanel jlabel


    【解决方案1】:

    但是当向它添加 JLabel 时,我无法将它移动到任何地方

    JPanel 的默认布局管理器是FlowLayout。当您将组件添加到面板时,它们会根据布局管理器的规则进行定位。

    getContentPane().setLayout(null);
    

    您不想将内容窗格布局设置为空,而是要将Surface 面板布局设置为空。

    但是,当您执行此操作时,您现在负责管理布局管理器的功能,这意味着一旦您将标签添加到 Surface 面板,您就负责设置标签的大小和位置。位置和大小都将默认为 (0, 0)。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多