2015-05-10 2 views
5

В этом коде у меня есть панель в GridBagLayout, которая содержит JLabel и JTextField.Автоматический повторный калибровка компонента в GridBagLayout

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

public class Simple 
{ 
    JFrame simpleWindow = new JFrame("Simple MCVE"); 

    JPanel simplePanel = new JPanel(); 

    JLabel lblSimple; 
    JTextField txtSimple; 

    public void numberConvertGUI() 
    { 
     simpleWindow.setBounds(10, 10, 420, 80); 

     simpleWindow.setMinimumSize(new Dimension(420, 80)); 

     simpleWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     simpleWindow.setLayout(new GridLayout(1,1)); 

     createSimplePanel(); 

     simpleWindow.getContentPane().add(simplePanel); 

     simpleWindow.setVisible(true); 
    } 

    public void createSimplePanel() 
    { 
     simplePanel.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     lblSimple = new JLabel(); 
     c.weightx = 0.0; 
     c.weighty = 1.0; 
     c.fill = GridBagConstraints.BOTH; 
     c.insets = new Insets(0,2,0,2); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.ipady = 0; 
     lblSimple.setText("Next to me is a JTextField: "); 
     lblSimple.setHorizontalAlignment(JLabel.RIGHT); 
     simplePanel.add(lblSimple, c); 

     txtSimple = new JTextField(); 
     c.weightx = 0.5; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 5; 
     c.gridx = 1; 
     c.gridy = 0; 
     c.insets = new Insets(0,2,0,2); 
     simplePanel.add(txtSimple, c); 
    } 

    public static void main(String[] args) 
    { 
     Simple s = new Simple(); 
     s.numberConvertGUI(); 
    } 
} 

Я хотел бы иметь возможность автоматически изменять размер текстового поля в зависимости от количества введенных в него данных. Например, когда строка «Как изменить размер этого компонента автоматически, когда его край достигнут?» введен в JTextField, он выглядит так.

What it looks like

Однако, как я вхожу в строку Я хотел бы JTextBox и тому JFrame автоматически изменить размер, чтобы произвести то, что выглядит немного как это.

The re-sized version

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

Редактировать

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

+0

добавить DocumentListener к JTextField, что вычисления Длина строки в JTextField или число столбцов с намерениями GetPreferredSize или Dimension для JTextField, то звонить перепроверить и перерисовать в JFrame (возможно, эти два уведомления должны быть оберткой в ​​invokeLater) – mKorbel

ответ

1

В Swing нет встроенных функций.

Что нужно сделать, это добавить DocumentListener к документу за текстовым полем и получать уведомление, когда текст будет добавлен или удален из него.

Затем вам нужно будет рассчитать новый размер, который вы хотите для своего текстового поля (что может показаться сложным в себе - вам, вероятно, понадобится использовать FontMetrics) и изменить размер элемента управления для соответствия. Максимальный размер, который вы можете легко реализовать в этот момент, просто просмотрев размер, который вы обновляете, по сравнению с максимальным, который вы хотите разрешить.

Смотрите здесь для получения информации о DocumentListener: https://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html

Смотрите здесь для получения информации о FontMetrics: https://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html

+0

Благодарим вас за это, я просто получил его работу с использованием шрифтов и прослушивателя документов – Dan

1

После изменения моего макета в MigLayout мне удалось получить свой код, чтобы сделать то, что я хотел. Для тех, кто читает это, кто заинтересован в том, как это сделать, см. Код ниже.

import java.awt.*; 
import javax.swing.*; 
import java.lang.Object.*; 
import javax.swing.event.*; 
import javax.swing.text.*; 
import net.miginfocom.swing.MigLayout; 

public class Simple 
{ 
    JFrame simpleWindow = new JFrame("Simple MCVE"); 

    JPanel simplePanel = new JPanel(); 

    JLabel lblTitle; 
    JLabel lblSimple; 
    JTextField txtSimple; 

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    String []fontFamilies = ge.getAvailableFontFamilyNames(); 

    int adv; 
    int widthOftxtSimple; 
    int i; 
    int xDimension; 

    public static int GetScreenWorkingWidth() 
    { 
     return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; 
    } 

    int maxSize = GetScreenWorkingWidth()-50; 

    public void numberConvertGUI() 
    { 
     simpleWindow.setBounds(10, 10, 800, 100); 

     simpleWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     simpleWindow.setResizable(false); 

     simpleWindow.setLayout(new GridLayout(1,1)); 

     createSimplePanel(); 

     simpleWindow.getContentPane().add(simplePanel); 

     simpleWindow.setVisible(true); 
    } 

    public void createSimplePanel() 
    { 
     MigLayout layout = new MigLayout("" , "[][grow]"); 
     simplePanel.setLayout(layout); 

     lblTitle = new JLabel(); 
     lblTitle.setText("This is a Title"); 
     simplePanel.add(lblTitle, "wrap, align center,span 2"); 

     lblSimple = new JLabel(); 
     lblSimple.setText("Next to me is a JTextField: "); 
     simplePanel.add(lblSimple); 

     String sMPMConstraints = "width 615::"+maxSize; 
     txtSimple = new JTextField(); 
     simplePanel.add(txtSimple, "grow, "+sMPMConstraints); 

     myDocumentListener(); 
    } 

    public void myDocumentListener() 
    { 
     Document doc = txtSimple.getDocument(); 
     DocumentListener listener = new DocumentListener() 
     { 
      @Override 
      public void insertUpdate(DocumentEvent e) 
      { 
       System.out.println("Insert"); 
       String simpleString = txtSimple.getText(); 
       Graphics graphics = txtSimple.getGraphics(); 
       Font test = txtSimple.getFont(); 
       FontMetrics metrics = graphics.getFontMetrics(test); 
       adv = metrics.stringWidth(simpleString); 
       System.out.println("The width of the string is: "+adv); 
       widthOftxtSimple = txtSimple.getWidth(); 
       System.out.println("The width of the JTextField is: "+widthOftxtSimple); 
       if(xDimension<maxSize) 
       { 
        System.out.println("The x dimension is shorter than the max size which is: "+maxSize); 
        if(widthOftxtSimple-20<adv) 
        { 
         i = 615-20-adv; //615 in this case is the original length of the text box 
         //change for different text boxes 
         System.out.println("Value of i is: "+i); 
         xDimension = 800-i; 
         System.out.println("Value of xDimension is: "+xDimension); 
         simpleWindow.setBounds(10, 10, xDimension, 100); 
        } 
       } 

       else 
       { 
        System.out.println("The x dimension is longer than the max size which is: "+maxSize); 
        simpleWindow.setBounds(10, 10, maxSize, 100); 
        String lastCharSize = simpleString.charAt(simpleString.length() - 1)+""; 
        int adv2 = metrics.stringWidth(lastCharSize); 
        xDimension = xDimension+adv2; 
       } 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) 
      { 
       System.out.println("Remove"); 
       String simpleString = txtSimple.getText(); 
       Graphics graphics = txtSimple.getGraphics(); 
       Font test = txtSimple.getFont(); 
       FontMetrics metrics = graphics.getFontMetrics(test); 
       widthOftxtSimple = txtSimple.getWidth(); 
       System.out.println("The width of the JTextField is: "+widthOftxtSimple); 
       System.out.println("Value of xDimension is: "+xDimension); 
       if(xDimension<maxSize) 
       { 
        if(xDimension>800) //Original length of the JFrame 
        { 
         System.out.println("last char = " + simpleString.charAt(simpleString.length() - 1)); 
         String lastCharSize = simpleString.charAt(simpleString.length() - 1)+""; 
         int adv2 = metrics.stringWidth(lastCharSize); 
         int newX = xDimension-adv2; 
         simpleWindow.setBounds(10, 10, newX, 100); 
         xDimension = newX; 
         if(xDimension<800) 
         { 
          simpleWindow.setBounds(10, 10, 800, 100); 
         } 
        } 
       } 

       else 
       { 
        System.out.println("last char = " + simpleString.charAt(simpleString.length() - 1)); 
        String lastCharSize = simpleString.charAt(simpleString.length() - 1)+""; 
        int adv2 = metrics.stringWidth(lastCharSize); 
        int new3 = xDimension-adv2; 
        System.out.println("This is the else statement"); 
        System.out.println("The new `xDimension` will be:"+ new3); 
        xDimension = new3; 
       } 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) 
      { 
       System.out.println("Change"); 
      } 
     }; 
     doc.addDocumentListener(listener); 
    } 

    public static void main(String[] args) 
    { 
     Simple s = new Simple(); 
     s.numberConvertGUI(); 
    } 
} 

Чтобы скомпилировать это без ошибок вам понадобится MigLayout package скачано

Смежные вопросы