2017-12-27 32 views
-1

Mein Ziel ist es, nur das Bild in die Mitte zu verschieben.
Aber wenn ich das Bild nach rechts oder links verschiebe, werden die from Beschriftung und das Textfeld auch um den Betrag verschoben, den ich für das Bild angegeben habe.
Gibt es eine Möglichkeit zu verhindern, dass sich das Etikett und das Textfeld bewegen, während das Bild verschoben wird?
Hier ist, was ich bisher getan:GridBagLayout: So verschieben Sie bestimmte Komponenten

// Center 

center = new JPanel(); 
center.setLayout(new GridBagLayout()); 
GridBagConstraints gbc = new GridBagConstraints(); 
Border innerC = BorderFactory.createTitledBorder("Travel details"); 
Border outsideC = BorderFactory.createEmptyBorder(5,5,5,5); 
center.setBorder(BorderFactory.createCompoundBorder(outsideC,innerC)); 

fromLabel = new JLabel("From : "); 
fromField = new JTextField("to",30); 
fromLabel.setFont(font); 

gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.weightx = 4.0; 
gbc.weighty = 4.0; 
gbc.insets = new Insets(5,4,5,5); 
gbc.fill = GridBagConstraints.NONE; 
gbc.anchor = GridBagConstraints.LINE_END; 
center.add(fromLabel,gbc); 

gbc.gridx = 1; 
gbc.gridy = 0; 
gbc.weightx = 1; 
gbc.weighty = 1; 
gbc.fill = GridBagConstraints.NONE; 
gbc.anchor = GridBagConstraints.LINE_START; 
gbc.gridwidth = 1; 
center.add(fromField,gbc); 

JButton trainImage = new JButton(); 
trainImage.setIcon(new ImageIcon("train.jpg")); 

gbc.gridx = 1; 
gbc.gridy = 20; 
gbc.weightx = 10; 
gbc.weighty = 20; 
gbc.fill = GridBagConstraints.NONE; 
gbc.anchor = GridBagConstraints.CENTER; 
gbc.gridwidth = 3; 
gbc.ipadx = 5; 
center.add(trainImage,gbc); 

this.add(center, BorderLayout.CENTER); 
this.setVisible(true); 

Main-Methode:

public static void main(String[] args) { 
    gui g = new gui(); 
} 

enter image description here

+0

Für bessere Hilfe, früher, ein [MCVE] oder [kurze, unabhängige, korrekte Beispiel] (http://www.sscce.org/). –

Antwort

1

Der obige Code schlägt ein Missverständnis, wie beide weightx/y & gridx/y Arbeit. Dieser MCVE korrigiert die Zahlen, um die Schaltfläche mit Bild zu zentrieren, während das Label und das Textfeld oben links bleiben.

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

public class CenteredImageInGridBag { 

    private JComponent ui = null; 

    CenteredImageInGridBag() { 
     initUI(); 
    } 

    public final void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new BorderLayout(4, 4)); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 

     JPanel center = new JPanel(); 
     ui.add(center); 
     center.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     Border innerC = BorderFactory.createTitledBorder("Travel details"); 
     Border outsideC = BorderFactory.createEmptyBorder(5, 5, 5, 5); 
     center.setBorder(BorderFactory.createCompoundBorder(outsideC, innerC)); 

     JLabel fromLabel = new JLabel("From : "); 
     JTextField fromField = new JTextField("to", 30); 

     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 0; 
     gbc.weighty = 0; 
     gbc.insets = new Insets(5, 4, 5, 5); 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.anchor = GridBagConstraints.LINE_END; 
     center.add(fromLabel, gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.weightx = 0; 
     gbc.weighty = 0; 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.anchor = GridBagConstraints.LINE_START; 
     gbc.gridwidth = 1; 
     center.add(fromField, gbc); 

     JButton trainImage = new JButton(); 
     BufferedImage image = 
       new BufferedImage(40,10,BufferedImage.TYPE_INT_RGB); 
     trainImage.setIcon(new ImageIcon(image)); 

     gbc.gridx = 1; 
     gbc.gridy = 1; 
     gbc.weightx = 1; 
     gbc.weighty = 1; 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.anchor = GridBagConstraints.CENTER; 
     gbc.gridwidth = 3; 
     gbc.ipadx = 5; 
     center.add(trainImage, gbc); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r =() -> { 
      try { 
       UIManager.setLookAndFeel(
         UIManager.getSystemLookAndFeelClassName()); 
      } catch (Exception useDefault) { 
      } 
      CenteredImageInGridBag o = new CenteredImageInGridBag(); 

      JFrame f = new JFrame(o.getClass().getSimpleName()); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      f.setLocationByPlatform(true); 

      f.setContentPane(o.getUI()); 
      f.pack(); 
      f.setMinimumSize(f.getSize()); 

      f.setVisible(true); 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
Verwandte Themen