Установить размер JLabel внутри JToolbar - PullRequest
2 голосов
/ 10 марта 2011

У меня есть некоторые проблемы с настройкой размера компонента JLabel, вставленного в JToolbar.Я использую JLabel для отображения фактических координат мыши, но в зависимости от длины числа JLabel меняет свой размер, вызывая некоторые неприятные движения моих компонентов JToolbar.

Я играю с setSize, setMinimumSize и т. Д., Чтобы преодолетьэта проблема, но до сих пор нет результатов.Я знаю, что поведение этих методов меняется в соответствии с менеджером компоновки.

Какой правильный метод для определения фиксированного минимального измерения JLabel в JToolbar?

Вот мой код:

public class EditorStatusBar extends JToolBar{

private JLabel areaCoordX;
private JLabel areaCoordY;

public EditorStatusBar(){
    super();

    addSeparator(new Dimension(100,this.getSize().height));

    this.areaCoordX = new JLabel("    ");
    this.areaCoordX.setMinimumSize(new Dimension(80,10));
    this.areaCoordX.setPreferredSize(new Dimension(80,10));
    this.areaCoordX.setHorizontalAlignment(JLabel.RIGHT);
    this.areaCoordX.setOpaque(true);

    this.areaCoordY = new JLabel("");
            this.add(areaCoordX);
    this.add(new JLabel(":"));
    this.add(areaCoordY);

     }
}

public void setCoordOfComponent(Point c){
        this.areaCoordX.setText(""+c.x);
        this.areaCoordY.setText(""+c.y);
    }
}

public class Gui extends JFrame implements ActionListener, ItemListener,ChangeListener{
private EditorStatusBar statusBar;
public static void main(String[] args) {
    new Gui();
}
private void buildStatusBar(){

    statusBar = new EditorStatusBar();
    statusBar.setFloatable(false);
    statusBar.setMaximumSize(new Dimension(2000, 20));
}
public Gui() {

super();
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
buildStatusBar();
this.getContentPane().add(statusBar);

}}

Когда я обновляю значение с помощью setCoordOfComponent (), оно работает, если я установил как минимальный, так и предпочтительный размер, но когда мышь находится, например, над JMenu, размер JPanel уменьшается.

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Я не смог заставить его работать с JLabel, но если вы хотите использовать вместо него JTextField, вы можете создать те с фиксированной шириной (количество столбцов). Вот мой рабочий пример с кнопками с обеих сторон, показывающими, что размер панели инструментов не изменяется.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class EditorStatusBar extends JToolBar {
    private final JTextField coords;

    public EditorStatusBar(Component parent) {
        super();

        setFloatable(false);

        add(new JButton("Button 1"));
        addSeparator();

        coords = new JTextField(5);
        coords.setEditable(false);
        coords.setHorizontalAlignment(JTextField.CENTER);
        add(coords);

        addSeparator();
        add(new JButton("Button 2"));

        parent.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                Point p = e.getPoint();
                coords.setText(p.x + ":" + p.y);
            }
        });
    }
}

class Gui extends JFrame {
    public static void main(String[] args) {
        Gui gui = new Gui();
        gui.setVisible(true);
    }

    public Gui() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        add(new EditorStatusBar(this), BorderLayout.NORTH);
        add(new JLabel("Content", JLabel.CENTER), BorderLayout.CENTER);
        pack();
    }
}
1 голос
/ 18 июля 2012

Я мог бы сделать это с помощью следующего кода. Чтобы исправить размер компонента, мне пришлось использовать каждый из setPreferredSize, setMaximumSize и setMinimumSize.

/**
 * Insert a component in the toolbar and specify its width.
 *
 * @param component
 */
protected void addToolbarItem(JLabel component, int width)
{
    addToolbarItem(component);
    final Dimension dim = new Dimension(width, toolBar.getHeight());
    component.setPreferredSize(dim);
    component.setMinimumSize(dim);
    component.setMaximumSize(dim);
    component.setBorder(new LineBorder(Color.BLACK));
}
0 голосов
/ 10 марта 2011

Ваш код в порядке, но вы забыли добавить компоненты на панель инструментов.

добавить эти строки в конструкторе панели инструментов

add(areaCoordX);
add(areaCoordY);

Теперь это должно выглядеть так

public class EditorStatusBar extends JToolBar{

private JLabel areaCoordX;
private JLabel areaCoordY;

public EditorStatusBar(){
    super();

    addSeparator(new Dimension(100,this.getSize().height));

    this.areaCoordX = new JLabel("    ");
    this.areaCoordX.setMinimumSize(new Dimension(80,10));
    this.areaCoordX.setPreferredSize(new Dimension(80,10));
    this.areaCoordX.setHorizontalAlignment(JLabel.RIGHT);
    this.areaCoordX.setOpaque(true);
    this.areaCoordY = new JLabel("");
    add(areaCoordX);
    add(areaCoordY);
     }
public void setCoordOfComponent(Point c){
        this.areaCoordX.setText(""+c.x);
        this.areaCoordY.setText(""+c.y);
    }
}

Я предлагаю добавить текст в метку, чтобы увидеть их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...