2017-01-19 7 views
0

Я испробовал все возможное, чтобы исправить размер JLabel, но он продолжает меняться, и это приводит к тому, что другие элементы в графическом интерфейсе перемещаются.Java Swing как исправить размер JLabel

Я указал как размер, так и расстояние между компонентами. В соответствии с GridBagLayout, ipadx и ipady«Задает внутреннее заполнение: сколько добавить в размер компонента». Согласно сообщению this, setMinimumSize и setMaximumSize позволяют установить фактический размер компонента. Поскольку я исправил как размер, так и интервал, как возможно, что компоненты продолжают прыгать, когда текст появляется в JLabel?

Я смог решить это на практике, добавив пробел в пустой текст, но это продолжает прослушивать меня. Что я не понимаю об этом?

Это SSCCE, демонстрирующий проблему. Он имеет элементы, расположенные в GridBagLayout, и изменение содержимого одной JLabel в одной ячейке приводит к перемещению всех элементов.

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

public class F { 
public static void main(String[] args) throws IOException, InterruptedException { 
    JFrame frame = new JFrame(); 

    JPanel mainView = new JPanel(); 
    mainView.setPreferredSize(new Dimension(300, 300)); 
    mainView.setLayout(new GridBagLayout()); 

    JPanel contents = new JPanel(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.insets = new Insets(1,3,3,3); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    gbc.ipady = 2; 
    gbc.anchor = GridBagConstraints.EAST; 

    JLabel text1 = new JLabel("Some text: "); 
    contents.add(text1, gbc); 
    gbc.gridy++; 
    JLabel text2 = new JLabel("More text: "); 
    contents.add(text2, gbc); 
    gbc.gridy++; 
    JLabel text3 = new JLabel("Third line: "); 
    contents.add(text3, gbc); 
    gbc.gridx++; 
    gbc.gridy = 0; 

    JTextField textField1 = new JTextField(10); 
    contents.add(textField1, gbc); 
    gbc.gridx++; 
    gbc.gridy++; 
    gbc.gridx--; 

    JTextField textField2 = new JTextField(10); 
    contents.add(textField2, gbc); 
    gbc.gridy++; 

    JLabel sitePass = new JLabel(""); 
    sitePass.setMaximumSize(new Dimension(100, 15)); 
    sitePass.setMinimumSize(new Dimension(100, 15)); 
    //sitePass.setPreferredSize(new Dimension(100, 15)); // <-- this line fixes the problem 
    contents.add(sitePass, gbc); 

    mainView.add(contents); 

    frame.add(mainView); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    while (true) { 
     Thread.sleep(1000); 
     sitePass.setText("Pushup time"); 
     Thread.sleep(1000); 
     sitePass.setText(""); 
    } 
} 
} 
+0

Где ваш [mcve]? PS: 'setPreferedSize (int)' может помочь (я помещаю три «предпочтительных, минимальных, максимальных» в одно и то же значение) на фиксированный размер – AxelH

+0

Извините за пример, я случайно удалил слишком много, когда пытался создать минимальный пример. –

+0

Вы правы, minimumSize и maximumSize было недостаточно. Добавление preferredSize фиксировало его. –

ответ

1

Качели использовать preferredSize для некоторого макета. Настройка будет исправлена.

Я привык к фиксирую JComponent установка minimum, maximum и preferred размера просто чтобы быть уверенными;)

PS: Я буду стараться, чтобы добавить больше информации о том, как использовать его.

+4

[Следует избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing? ] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) – MadProgrammer

+0

@MadProgrammer, спасибо за это. Ну, в этой теме есть плюсы и минусы. Подойдите ближе к каждому. Но принятый ответ предполагает использовать внешний API (JGoodies), чтобы заполнить пробел в макете, предоставленном ... – AxelH

+0

@MadProgrammer, здесь вы можете увидеть резкое использование этих свойств в [демо] (http://docs.oracle .com/javase/tutorial/displayCode.html? code = http: //docs.oracle.com/javase/tutorial/uiswing/examples/components/HtmlDemoProject/src/components/HtmlDemo.java) из Oracle. – AxelH

3

Один из способов решения проблемы. Изменение:

JLabel sitePass = new JLabel(""); 

To:

JTextField sitePass = new JTextField("", 12); 
    sitePass.setOpaque(false); 
    sitePass.setBorder(null); 

Объяснение: JTextField имеет размер по умолчанию определяется числом столбцов, в сочетании с шрифта и размера шрифта. Следующие два утверждения гарантируют, что он имеет вид JLabel.

Улучшения было бы также сделать текстовое поле акта как ярлык, который может быть что-то вдоль линий:

sitePass.setEditable(false); 
    sitePass.setFocusable(false); 
1

Существует еще один способ использовать манекен пробельный как JComboBox.

//javax.swing.plaf.basic.BasicComboBoxUI#getDefaultSize() 
/** 
* Return the default size of an empty display area of the combo box using 
* the current renderer and font. 
* 
* @return the size of an empty display area 
* @see #getDisplaySize 
*/ 
protected Dimension getDefaultSize() { 
    // Calculates the height and width using the default text renderer 
    Dimension d = getSizeForComponent(getDefaultListCellRenderer() 
    .getListCellRendererComponent(listBox, " ", -1, false, false)); 
    return new Dimension(d.width, d.height); 
} 
import java.awt.*; 
import java.util.Objects; 
import javax.swing.*; 

public class DummyWhiteSpaceTest { 
    public JComponent makeUI(String dummy) { 
    JPanel mainView = new JPanel(new GridBagLayout()); 

    JPanel contents = new JPanel(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.insets = new Insets(1, 3, 3, 3); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    gbc.ipady = 2; 
    gbc.anchor = GridBagConstraints.EAST; 

    /* Text labels. */ 
    JLabel text1 = new JLabel("Some text: "); 
    contents.add(text1, gbc); 
    gbc.gridy++; 
    JLabel text2 = new JLabel("More text: "); 
    contents.add(text2, gbc); 
    gbc.gridy++; 
    JLabel text3 = new JLabel("Third line: "); 
    contents.add(text3, gbc); 
    gbc.gridx++; 
    gbc.gridy = 0; 

    JTextField textField1 = new JTextField(10); 
    contents.add(textField1, gbc); 
    gbc.gridx++; 
    gbc.gridy++; 
    gbc.gridx--; 

    JTextField textField2 = new JTextField(10); 
    contents.add(textField2, gbc); 
    gbc.gridy++; 

    //@see javax.swing.plaf.basic.BasicComboBoxUI#getDefaultSize() 
    //JLabel sitePass = new JLabel(" "); 
    JLabel sitePass = new JLabel(dummy); 
    sitePass.setFont(new Font("Monospaced", Font.PLAIN, 14)); 
    contents.add(sitePass, gbc); 

    mainView.add(contents); 

    (new Timer(1000, e -> { 
     if (Objects.equals(sitePass.getText(), dummy)) { 
     sitePass.setText("Pushup time"); 
     } else { 
     sitePass.setText(dummy); 
     } 
    })).start(); 

    return mainView; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     DummyWhiteSpaceTest test = new DummyWhiteSpaceTest(); 
     JPanel p = new JPanel(new GridLayout(1, 2)); 
     p.add(test.makeUI("")); 
     p.add(test.makeUI(" ")); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(p); 
     f.setSize(640, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
}