11

我试图在 JPanel 上的特定 X 和 Y 坐标处放置一系列 JLabel(并设置它的高度和宽度)。无论我做什么,每个标签都会立即在前一个标签的右侧结束,并且与所有其他标签的大小完全相同。

现在,我的 Jpanel 处于网格布局中。我尝试过 Absolute Layout(非法参数异常结果)、Free Design(没有标签出现)、Flow Layout(一切都被挤压到中心)和其他一些。

不知道我需要做什么才能完成这项工作。任何人都可以帮忙吗?谢谢!

JLabel lbl1 = new JLabel("label 1");
JLabel lbl2 = new JLabel("label 2");
JLabel lbl3 = new JLabel("label 3");
JLabel lbl4 = new JLabel("label 4");
JLabel lbl5 = new JLabel("label 5");

myPanel.add(lbl1);
myPanel.add(lbl2);
myPanel.add(lbl3);
myPanel.add(lbl4);
myPanel.add(lbl5);

lbl1.setLocation(27, 20);
lbl2.setLocation(123, 20);
lbl3.setLocation(273, 20);
lbl4.setLocation(363, 20);
lbl5.setLocation(453, 20);

lbl1.setSize(86, 14);
lbl2.setSize(140, 14);
lbl3.setSize(80, 14);
lbl4.setSize(80, 14);
lbl5.setSize(130, 14);
4

6 回答 6

16

您必须将容器的 Layout 设置为 null:

myPanel.setLayout(null);

但是,最好还是看看 Matisse Layout Manager,我猜它现在被称为 GroupLayout。绝对定位的主要问题是当窗口改变其大小时会发生什么。

于 2012-08-25T05:27:00.727 回答
4
  1. 通过调用将容器的布局管理器设置为空setLayout(null)

  2. 为容器的每个子级调用 Component 类的setbounds方法。

  3. 调用 Component 类的重绘方法。

笔记:

如果调整包含容器的窗口大小,创建具有绝对定位容器的容器可能会导致问题。

参考这个链接: http ://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

于 2012-08-25T05:15:49.363 回答
3

布局管理器用于自动确定容器中组件的布局。如果您想将组件放置在特定的坐标位置,那么您根本不应该使用布局管理器。

myPanel = new JPanel(null);

或者

myPanel.setLayout(null);
于 2012-08-25T05:15:07.187 回答
2

我的建议是使用带有 GUI 编辑器的NetBeans之类的 IDE。检查代码,因为有很多方法:

设置布局管理器,或为绝对定位执行 myPanel.setLayout(null),有几个影响。

通常,假设您在 JFrame 的构造函数中进行调用,则可以调用pack()以开始布局。

然后,每个布局管理器都使用自己的add(Component)or实现add(Component, Constraint)。BorderLayout 的用法是与 add(label, BorderLayout.CENTER) 等。

于 2012-08-25T05:19:38.847 回答
0
    // Best solution!!

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

  public static void main(String args[]) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = (JPanel) frame.getContentPane();
    panel.setLayout(null);

    JLabel label = new JLabel("aaa");
    panel.add(label);
    Dimension size = label.getPreferredSize();
    label.setBounds(100, 100, size.width, size.height);

    frame.setSize(300, 200);
    frame.setVisible(true);

  }
}
于 2017-03-10T03:46:27.097 回答
-1

您可以使用自己的方法,通过 setSize、setLocation 值直接调用......!` 我还向您展示了如何使用 JProgress Bar

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

class installComp{
    void install(Component comp, int w, int h, int x, int y){
        comp.setSize(w,h);
        comp.setLocation(x,y);
    }
}
class MyFrame extends JFrame{
    int cur_val = 0;
    JButton btn = new JButton("Mouse Over");
    JProgressBar progress = new JProgressBar(0,100);
    MyFrame (){
        installComp comp=new installComp();

        comp.install(btn,150,30,175,20);
        comp.install(progress,400,20,50,70);

        btn.addMouseListener(new MouseAdapter(){
            public void mouseEntered(MouseEvent evt){
                cur_val+=2;
                progress.setValue(cur_val);
                progress.setStringPainted(true);
                progress.setString(null);
            }
        }); 
        add(btn);
        add(progress);
        setLayout(null);    
        setSize(500,150); 
        setResizable(false);
        setDefaultCloseOperation(3);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
class Demo{
    public static void main(String args[]){
        MyFrame f1=new MyFrame();   
    }
}
于 2016-06-11T18:54:31.017 回答