Не удается установить местоположение JLabel на JPanel - PullRequest
6 голосов
/ 22 февраля 2012

Я установил местоположение (0,0) для JLabel относительно JPanel. Но это проявляется в центре и сверху. Какую ошибку я делаю?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*;
public class Main extends JFrame 
{ 
private JPanel panel;
private JLabel label1;
public Main() 
{ 
    panel = new JPanel(); 
    panel.setBackground(Color.YELLOW); 

    ImageIcon icon1 = new ImageIcon("3.png"); 
    label1 = new JLabel(icon1); 
    label1.setLocation(0,0); 
    panel.add(label1);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().add(panel); 
    this.setSize(500,500); 
    this.setVisible(true); 

} 

public static void main (String[] args) {
    new Main(); 
} 
} 

Ответы [ 6 ]

8 голосов
/ 22 февраля 2012

Использовать макеты!

Screenshot of left aligned image icon

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

public class Main extends JFrame
{
    private JPanel panel;
    private JLabel label1;

    public Main() throws Exception
    {
        // Do use layouts (with padding & borders where needed)!
        panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel.setBackground(Color.YELLOW);

        URL url = new URL("http://pscode.org/media/starzoom-thumb.gif");
        ImageIcon icon1 = new ImageIcon(url);

        label1 = new JLabel(icon1);
        // Don't use null layouts, setLocation or setBounds!
        //label1.setLocation(0,0);
        panel.add(label1);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(panel);
        setSize(400,200);
        setLocationByPlatform(true);
        setVisible(true);
    }

    public static void main (String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Main();
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Обновление

Кажется, что в ответах на эту ветку много путаницы, поэтому проясним один вопрос:

  • A JPanel по умолчанию имеет FlowLayout.
  • FlowLayout, который он получает, исходит из конструктора no args, например new FlowLayout() 1 .
  • Конструктор без аргументов для FlowLayout производит ..

    (1) .. новый FlowLayout с центрированным выравниванием и 5-элементным горизонтальным и вертикальным зазором по умолчанию.

8 голосов
/ 22 февраля 2012

Установка диспетчера макета на null не работает для меня. Попробуйте это:

// setLocation(0,0); //remove line.
panel.setLayout(new FlowLayout(FlowLayout.LEFT)); // change from 'centered'

Вуаля! :) Рекомендую заглянуть в новый RelativeLayout менеджер.

3 голосов
/ 22 февраля 2012

Вы не можете сделать это, потому что менеджер по умолчанию заботится о рендеринге элементов на вашу панель.

Если вы действительно хотите установить элемент на позицию, вы выбираете, скажем panel = new JPanel(null);

Но подожди минутку! Вы действительно хотите сделать это? Я верю, что нет. Мы (Java-программисты) обычно используем сервис, предоставляемый менеджерами компоновки, для визуализации элементов на экране. Вы должны потратить час, чтобы изучить и понять концепцию, а затем я обещаю вам, что вы будете использовать эту технику и забудете о ручном рендеринге элементов на экране, как о очень плохом сне.

2 голосов
/ 22 февраля 2012

Вы не можете установить абсолютное местоположение Component, в то время как Container имеет LayoutManager;Вы должны позвонить setLayout(null) на JPanel, прежде чем это сработает.

1 голос
/ 21 июля 2012
setLayout(null); //set your frame layout to null for abs. positioning
yourPanel = new JPanel(); // create your JPanel
yourPanel.setLayout(null); // set the layout null for this JPanel !

text1 = new JLabel("SB"); // create some stuff
text2 = new JLabel("BB");

yourPanel.add(text1); // add the stuff to the JPanel
yourPanel.add(text2);
yourPanel.getComponent(0).setBounds(0,0, 20, 20); // set your position of your elements inside your JPanel
yourPanel.setBorder(BorderFactory.createLineBorder(Color.black)); // set a testing border to help you position the elements better
yourPanel.setBounds(30, 200, 750, 220); // set the location of the JPanel

// оставьте мне ответ

1 голос
/ 22 февраля 2012

Написав

panel = new JPanel ();

, вы заставляете панель использовать FlowLayout, который добавляет элементы встроенными.Вы можете использовать

panel = new JPanel (null);

, если вы хотите повысить производительность, отключив диспетчер FlowLayout, но при этом вы должны позаботитьсядля неприятных вещей, таких как расположение компонентов, размеры и так далее.Я думаю, что лучше использовать менеджеры по расположению

...