2015-05-10 19 views
5

In questo codice ho un pannello nello GridBagLayout che contiene uno JLabel e uno JTextField.Ridimensionamento automatico di un componente all'interno di 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(); 
    } 
} 

mi piacerebbe essere in grado il campo di testo dipende dalla quantità di dati inseriti in esso per ridimensionare automaticamente. Ad esempio quando la stringa "Come faccio a ridimensionare questo componente automaticamente quando viene raggiunto il limite?" è inserito nel JTextField sembra così.

What it looks like

Tuttavia, come io entro la stringa vorrei che la JTextBox e la JFrame per ridimensionare automaticamente per produrre qualcosa che sembra un po 'come questo.

The re-sized version

L'unico problema è che non sono a conoscenza di tutto ciò che mi permette di fare questo. Apprezzerei molto qualsiasi aiuto nel portare a termine questo compito.

Modifica

Quando il componente viene ridimensionato automaticamente Vorrei anche che ci sia una dimensione massima per quel componente. In questo modo, man mano che vengono inseriti più dati, il componente non continuerà a ridimensionare il monitor del computer di qualcuno.

+0

aggiungere DocumentListener a JTextField che il calcolo String lunghezza in JTextField o il numero di colonne con l'intenzione di getPreferredSIze o Quota per JTextField, quindi chiamare rinnovare e ridisegnare a JFrame (forse quei due notificanti devono essere wrapper in invokeLater) – mKorbel

risposta

1

Non esiste alcuna funzionalità incorporata per eseguire questa operazione all'interno di Swing.

È necessario aggiungere un documento DocumentListener al documento dietro il campo di testo e ricevere una notifica ogni volta che viene aggiunto o rimosso del testo.

Sarà quindi necessario calcolare la nuova dimensione desiderata per il campo di testo (che può essere complicato da solo - probabilmente sarà necessario utilizzare FontMetrics) e ridimensionare il controllo in modo che corrisponda. La dimensione massima che puoi implementare facilmente a questo punto osservando la dimensione che stai ridimensionando rispetto al massimo che desideri consentire.

Vedi qui per info su DocumentListener: https://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html

Vedi qui per info su FontMetrics: https://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html

+0

Grazie per questo, l'ho appena fatto funzionare usando la fontmetrics e l'ascoltatore di documenti – Dan

1

Dopo aver cambiato il mio layout al MigLayout sono riuscito ad ottenere il mio codice per fare quello che ho voluto. Per chiunque stia leggendo questo che era interessato a come farlo vedere il codice qui sotto.

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

per compilare questo senza errori è necessario il MigLayout package scaricato