2017-12-27 284 views
-1

我的目標是僅將圖像移動到中心位置。
但是,當我將圖像向右或向左移動時,from標籤和文本字段也會被我爲圖像指定的量推送。
有什麼辦法可以防止標籤和文本字段在圖片移動時移動?
這是我做的,到目前爲止:GridBagLayout:如何移動指定組件

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

主要方法:

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

enter image description here

+0

爲了更好地提供幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

回答

1

上面的代碼暗示的誤解都weightx/y & gridx/y是如何工作的。此MCVE將數字更正爲將按鈕與圖像居中,而將標籤和文本字段留在左上角。

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