2015-09-08 7 views
0

Я использую JLabel и перед ним JTextField, чтобы я мог представлять защитный stat со значением. Я использую следующий код:Java - компоненты GridBagLayout сверху исчезают при изменении размера

setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.insets = new Insets(10, 10, 10, 10); 

    JLabel jl = new JLabel(); 
    ImageIcon ii = new ImageIcon("C:\\Users\\Max\\Desktop\\shield.png"); 
    jl.setIcon(ii); 
    gbc.gridy = 0; 
    gbc.gridx = 0; 
    add(jl, gbc); 

    gbc.insets = new Insets(5, 10, 10, 10); 
    JTextField jtf = new JTextField(2); 
    jtf.setHorizontalAlignment(JTextField.CENTER); 
    gbc.ipadx = 10; 
    gbc.ipady = 10; 
    gbc.gridy = 0; 
    gbc.gridx = 0; 
    jtf.setFocusable(false); 
    add(jtf, gbc); 

И получите: enter image description here

Все хорошо, однако, если я пытаюсь изменить размер окна, то JTextField исчезает навсегда, и только JLabel шоу. Почему это так?

+0

Там нет никакой связи между позицией лейбла и положение текстового поля – MadProgrammer

+0

Как установить такие отношения? : S – darkchampionz

ответ

2
  1. Там нет никакой связи между положением метки и положение текстового поля, это означает, что метка и поле могут свободно перемещаться независимо друг от друга
  2. Существует проблема г-на заказ, компоненты ниже в порядке контейнера окрашиваются после тех, которые выше в порядке контейнера (обратный порядок), что означает, что наклейка фактически окрашивается перед экраном, когда весь контейнер обновляется. Причина, по которой он может иногда работать, потому что на самом деле компоненты могут быть окрашены независимо друг от друга, а это означает, что текстовое поле может фактически покраситься без необходимости извещать либо родительский контейнер или этикетку

Например ...

Shield

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 

      gbc.insets = new Insets(5, 10, 10, 10); 
      JTextField jtf = new JTextField(2); 
      jtf.setHorizontalAlignment(JTextField.CENTER); 
      gbc.ipadx = 10; 
      gbc.ipady = 10; 
      gbc.gridy = 0; 
      gbc.gridx = 0; 
      jtf.setFocusable(false); 
      add(jtf, gbc); 

      gbc = new GridBagConstraints(); 
      try { 
       JLabel jl = new JLabel(); 
       ImageIcon ii = new ImageIcon(ImageIO.read(getClass().getResource("/shield01.png"))); 
       jl.setIcon(ii); 
       gbc.gridy = 0; 
       gbc.gridx = 0; 
       add(jl, gbc); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

    } 

} 

Возможной лучшее решение было бы создать «фоновый» компонент, который взял изображение и нарисованный его в качестве фона компонента, а затем добавить свое текстовое поле к нему.

Background

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class TestBackground { 

    public static void main(String[] args) { 
     new TestBackground(); 
    } 

    public TestBackground() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 

      try { 
       BackgroundPane pane = new BackgroundPane(ImageIO.read(getClass().getResource("/shield02.png"))); 
       pane.setLayout(new GridBagLayout()); 
       pane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
       GridBagConstraints gbc = new GridBagConstraints(); 

       JTextField jtf = new JTextField(2); 
       jtf.setHorizontalAlignment(JTextField.CENTER); 
       gbc.ipadx = 10; 
       gbc.ipady = 10; 
       gbc.gridy = 0; 
       gbc.gridx = 0; 
       jtf.setFocusable(false); 
       pane.add(jtf, gbc); 

       add(pane); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 

    } 

    public class BackgroundPane extends JPanel { 

     private BufferedImage img; 

     public BackgroundPane(BufferedImage img) { 
      this.img = img; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return img != null ? new Dimension(img.getWidth(), img.getHeight()) : super.getPreferredSize(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (img != null) { 
       int x = (getWidth() - img.getWidth())/2; 
       int y = (getHeight() - img.getHeight())/2; 
       g.drawImage(img, x, y, this); 
      } 
     } 

    } 

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