2013-02-28 2 views
2

У меня есть пользовательский JPanel, который метод paintComponent переопределяется для рисования изображения.Пустые рамки на JPanel в BoxLayout.X_AXIS

Я хочу вставить несколько из этих настраиваемых панелей, вертикально центрированных в контейнере. Для этого я создал jpanel с BoxLayout.X_AXIS в качестве менеджера макетов.

representation

Это прекрасно работает и показывает, что я хочу, но я хотел бы добавить поля между пользовательскими панелями.

EmptyMargins просто игнорируются, и сложная часть состоит в том, что я не могу (или не хотел бы ...) добавлять стойки или ящики между ними, потому что мне нужно получить каждую настраиваемую панель из цикла, который принимает все компоненты контейнера и отбросить их в CustomPanel.

Уточнить проблему? Если я добавлю стойки между панелями, будет исключение литья, а EmptyBorders не будут работать ... Любые идеи приветствуются!

Примечание: Я открыт для других предложений менеджера макетов! ;-)

Вот код:

public class StackExemple { 

public StackExemple() { 

    JFrame frame = new JFrame(); 
    frame.setPreferredSize(new Dimension(600, 300)); 

    JPanel container = new JPanel(); 
    container.setPreferredSize(new Dimension(600, 300)); 
    container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); 

    CustomPanel customPanel1 = new CustomPanel(); 
    CustomPanel customPanel2 = new CustomPanel(); 
    CustomPanel customPanel3 = new CustomPanel(); 

    container.add(customPanel1); 
    container.add(customPanel2); 
    container.add(customPanel3); 

    frame.getContentPane().add(container); 
    frame.pack(); 
    frame.setVisible(true); 

    //Loop which takes the custompanels 
    for(Component comp : container.getComponents()) { 
     CustomPanel panel = (CustomPanel)comp; 
     //DO SOMETHING 

     System.out.println("Hello World"); 
    } 
} 

private class CustomPanel extends JPanel{ 

    private BufferedImage image; 

    public CustomPanel() { 
     setPreferredSize(new Dimension(100, 100)); 
     setMinimumSize(getPreferredSize()); 
     setMaximumSize(getPreferredSize()); 
     setBorder(BorderFactory.createEmptyBorder(0,50,0,0)); 
     setBackground(Color.RED); 

//  try { 
//   image = ImageIO.read(ClassLoader.getSystemClassLoader().getResource("Ressources/img.png")); 
//  } catch (IOException ex) { 
//   System.out.println("Ooops... "); 
//  } 
    } 

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

ответ

2

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.image.BufferedImage; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class StackExemple { 

    public StackExemple() { 
     JFrame frame = new JFrame(); 
     JPanel container = new JPanel(); 
     container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); 
     CustomPanel customPanel1 = new CustomPanel(Color.blue); 
     CustomPanel customPanel2 = new CustomPanel(Color.red); 
     CustomPanel customPanel3 = new CustomPanel(Color.green); 
     container.add(customPanel1); 
     container.add(customPanel2); 
     container.add(customPanel3); 
     frame.getContentPane().add(container); 
     frame.pack(); 
     frame.setVisible(true); 
     for (Component comp : container.getComponents()) { 
      CustomPanel panel = (CustomPanel) comp; 
      System.out.println("Hello World"); 
     } 
    } 

    private class CustomPanel extends JPanel { 

     private BufferedImage image; 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(100, 80); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 160); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return new Dimension(400, 320); 
     } 

     public CustomPanel(Color c) { 
      setBorder(BorderFactory.createCompoundBorder(
        BorderFactory.createEmptyBorder(10, 10, 10, 10), 
        BorderFactory.createLineBorder(Color.black, 1))); 
      //setBorder(BorderFactory.createCompoundBorder(
      //BorderFactory.createLineBorder(Color.black, 1), 
      //BorderFactory.createEmptyBorder(10, 10, 10, 10))); 
      setBackground(c); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       StackExemple stackExemple = new StackExemple(); 
      } 
     }); 
    } 
} 
+1

+1 для [sscce] (http://sscce.org/); есть соответствующий пример [здесь] (http://stackoverflow.com/a/15104660/230513) – trashgod

+0

Не думал об изменении максимального размера, но это работает отлично! Большое спасибо ! :-) –

2

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

Как вы, кажется, делают на заказ картины в любом случае, вы могли бы рассмотреть, чтобы сообщить о его непрозрачности, как ложные и только краска фона (и/или фоновое изображение) внутри каймой области:

// in constructor 
setOpaque(false); 

@Override 
protected void paintComponent(Graphics g) { 
    // take over background filling inside the border 
    Insets insets = getInsets(); 
    g.setColor(getBackground()); 
    g.fillRect(insets.left, insets.top, 
      getWidth() - insets.left - insets.right, 
      getHeight() - insets.top - insets.bottom); 

    super.paintComponent(g); 
    // for a background image, you would need to take the insets 
    // into account as well 
    // int x = (this.getWidth() - image.getWidth())/2; 
    // int y = (this.getHeight() - image.getHeight())/2; 
    // g.drawImage(image, x, y, null); 
} 
+0

Это решение работает также, но меняет размер панели из-за встроенных в нее вводов. Спасибо за ваш ответ ! :-) –

+0

+1 right [например] (http://stackoverflow.com/a/9258934/714968) – mKorbel

+0

@ Dar-Jee no, размер панели точно такой же - независимо от того, окрашена ли вся его область или только часть внутри границы. – kleopatra