2 Stimmen

Größe eines JLabels innerhalb einer JToolbar festlegen

Ich habe einige Probleme bei der Einstellung der Größe einer JLabel-Komponente, die in eine JToolbar eingefügt wurde. Ich verwende die JLabel, um tatsächliche Maus-Koordinaten anzuzeigen, aber je nach der Länge der Zahl JLabel ändern es ist Größe produzieren einige böse Bewegungen meiner JToolbar-Komponenten.

Ich spiele mit setSize, setMinimumSize, etc, um dieses Problem zu überwinden, aber immer noch keine Ergebnisse. Ich weiß, dass das Verhalten dieser Methoden entsprechend dem Layout-Manager zu ändern.

Welches ist die richtige Methode, um eine feste Mindestgröße für ein JLabel in einer JToolbar zu definieren?

Hier ist mein Code:

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

}}

Wenn ich den Wert mit setCoordOfComponent() aktualisiere, funktioniert es, wenn ich sowohl die minimale als auch die bevorzugte Größe einstelle, aber wenn die Maus zum Beispiel über dem JMenu ist, verringert sich die Größe des JPanels.

1voto

BoffinBrain Punkte 6007

Ich war nicht in der Lage, die Funktion mit einer JLabel aber wenn Sie bereit sind, eine JTextField stattdessen können Sie diese mit einer festen Breite (Anzahl der Spalten) erstellen. Hier ist mein Arbeitsbeispiel mit Schaltflächen auf beiden Seiten, um zu zeigen, dass sich die Größe der Symbolleiste nicht ändert.

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

1voto

Olivier Faucheux Punkte 2372

Ich könnte es mit dem folgenden Code machen. Um die Größe der Komponente festzulegen, musste ich jedes der folgenden Elemente verwenden setPreferredSize , setMaximumSize y 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));
}

0voto

Manoj Punkte 5362

Ihr Code ist in Ordnung, aber Sie haben vergessen, die Komponenten der Symbolleiste hinzuzufügen.

Fügen Sie diese Zeilen in den Konstruktor der Symbolleiste ein

add(areaCoordX);
add(areaCoordY);

Es sollte jetzt so aussehen

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

Ich schlage vor, einen Text in das Etikett einzufügen, um sie zu erkennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X