Placing a JLabel at a specific x,y coordinate on a JPanel

时光总嘲笑我的痴心妄想 提交于 2019-11-27 19:12:02

问题


I'm trying to place a series of JLabels at specific X and Y coordinates on a JPanel (and set its height and width, too). No matter what I do, each label winds up immediately to the right of the previous label and has the exact same size as all of the others.

Right now, my Jpanel is in a Grid Layout. I've tried Absolute Layout (illegal argument exception results), Free Design (no labels appear), Flow Layout (everything just gets squeezed to the center), and a few others.

Not sure what I need to do to make this work. Can anyone help? Thanks!

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);

回答1:


You have to set your container's Layout to null:

myPanel.setLayout(null);

However is a good advise also to take a look at the Matisse Layout Manager, I guess it is called GroupLayout now. The main problem with absolute positioning is what happens when the window changes its size.




回答2:


  1. Set the container's layout manager to null by calling setLayout(null).

  2. Call the Component class's setbounds method for each of the container's children.

  3. Call the Component class's repaint method.

Note:

Creating containers with absolutely positioned containers can cause problems if the window containing the container is resized.

Refer this link: http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html




回答3:


Layout managers are used to automatically determine the layout of components in a container. If you want to put components at specific coordinate locations, then you should not use a layout manager at all.

myPanel = new JPanel(null);

or

myPanel.setLayout(null);



回答4:


My advise is to use an IDE like NetBeans with its GUI editor. To inspect the code and because there are many ways:

Setting the layout manager, or for absolute positioning doing a myPanel.setLayout(null), has several influences.

In general, assuming you do your calls in the constructor of a JFrame, you can call pack() to start the layouting.

Then, every layout manager uses its own implementation of add(Component) or add(Component, Constraint). BorderLayout's usage is with add(label, BorderLayout.CENTER) and so on.




回答5:


    // 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);

  }
}



回答6:


You can use your own method that calling by setSize, setLocation values for directly....! ` As well i show you how to use 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();   
    }
}


来源:https://stackoverflow.com/questions/12119327/placing-a-jlabel-at-a-specific-x-y-coordinate-on-a-jpanel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!