2016-02-13 4 views
-1

Я пытаюсь сделать несколько строк, которые заполняют всю рамку по вертикали и по горизонтали. Я попробовал это с GridLayout с GridBagLayout и теперь с BoxLayout - та же самая проблема! Белые линии путем изменения размера ...BoxLayout показывает белую линию внизу

Я не знаю, какой LayoutManager я должен использовать, потому что все имеют ту же проблему! Я хочу отзывчивый макет, поэтому мне нужно использовать LayoutManager и не могу исправить элементы. Кто-нибудь может мне помочь?

Container parentPane = frame.getContentPane(); 
    JPanel parentPanel = new JPanel(); 
    parentPane.add(parentPanel);   

    parentPanel.setLayout(new javax.swing.BoxLayout(parentPanel, javax.swing.BoxLayout.Y_AXIS)); 
    JPanel[] parentPanelFields = new JPanel[6]; 

     for(int i = 0; i < 6; i++) { 
      parentPanelFields[i] = new JPanel();   
      parentPanelFields[i].setBackground(Color.RED); 
      if(i != 5) parentPanelFields[i].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE)); 

      parentPanel.add (parentPanelFields[i]); 

     } 

Результат кода является совершенным, но изменение размера кадра большой белой линии исчезают в в нижней части рамы ...

идеальный результат, но с большой жирной линией на дно:

http://i.stack.imgur.com/4r8HM.png

Это мой первый вопрос с той же проблемой, но с GridBagLayout: https://stackoverflow.com/questions/35384891/gridbaglayout-shows-white-lines-at-top-and-bottom?noredirect=1#comment58475366_35384891

Как я могу сделать эти строки в Y-AXIS без этих белых линий, изменив размер рамки?

Пожалуйста, помогите мне - я отчаялся в течение 3-х дней с этой проблемой ...

Большое спасибо, Waldi

EDIT1: Весь код:

import java.awt.*; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class test { 

public static void addComponentsToPane(JFrame frame) { 

    Container parentPane = frame.getContentPane(); 

    JPanel parentPanel = new JPanel(); 
    parentPane.add(parentPanel);   

    parentPanel.setLayout(new javax.swing.BoxLayout(parentPanel, javax.swing.BoxLayout.Y_AXIS)); 
    JPanel[] parentPanelFields = new JPanel[6]; 

     for(int i = 0; i < 6; i++) { 
      parentPanelFields[i] = new JPanel();   
      parentPanelFields[i].setBackground(Color.RED); 
      if(i != 5) parentPanelFields[i].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE)); 

      parentPanel.add (parentPanelFields[i]); 

     } 

} 

private static void createAndShowGUI() { 

    JFrame.setDefaultLookAndFeelDecorated(true); 
    JFrame frame = new JFrame("GridBagLayout Source Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Set up the content pane. 
    addComponentsToPane(frame); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

EDIT2: Решение от camickr:

Fi сначала загрузить класс RelativeLayout из https://tips4java.wordpress.com/2008/11/02/relative-layout/ (внизу страницы)

Второго шага заключается в написании кода для вашей проблемы -> в моем случае:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
    rl.setFill(true); 
    JPanel somePanel = new JPanel(); 
    somePanel.setBackground(Color.BLACK); 
    somePanel.setLayout(rl); 


    JPanel blue = new JPanel(); 
    blue.setBackground(Color.BLUE); 
    somePanel.add(blue, new Float(1)); 
    parentPane.add(somePanel); 

    JPanel green = new JPanel(); 
    green.setBackground(Color.GREEN); 
    somePanel.add(green, new Float(1)); 
    parentPane.add(somePanel); 

    JPanel red = new JPanel(); 
    red.setBackground(Color.RED); 
    somePanel.add(red, new Float(1)); 
    parentPane.add(somePanel); 

Используйте RelativeLayout как другие LayoutManagers!

+0

Похоже, что-то с бортиками. – Zizouz212

+0

Я не использую никаких границ. Даже ширина .setBorder (0, 0, 0, 0) белая линия показывает ... Любые идеи? – Waldi

+0

Где вы использовали '.setBorder()'? Вы пробовали использовать его на рамах, панелях и т. Д.? Это может быть что-то с самим компоновкой. – Zizouz212

ответ

4

Если у вас есть 6 панелей, которые добавлены в рамку, а рамка упакована, каждая панель будет отображаться так, как ожидалось.

Если вы увеличиваете размер рамки на 5 пикселей, недостаточно места, чтобы дать каждой панели дополнительный пиксель, так что у вас есть 5 дополнительных пикселей внизу, поскольку менеджер макета не знает, как распределить эти дополнительные пиксели с компонентами ,

Если вы затем развернете кадр еще 1 пиксель, тогда каждая панель получит дополнительный пиксель, и пространство исчезнет.

Вы можете использовать Relative Layout. Этот макет будет выделять эти дополнительные пиксели на 1 или более компонентов в зависимости от свойства, которое вы задали для менеджера макета.

Также с использованием Relative Layout не потребуется добавлять границу к каждому компоненту. Вы можете просто установить свойство «gap», чтобы оставить 1 пиксель между каждым компонентом. Затем откроется фон родительской панели.

Edit:

Основной код будет:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
rl.setFill(true); // to fill horizontal width 
rl.setGap(1); // so you don't need the border 
somePanel.setLayout(rl); 

Затем в цикле:

somePanel.add(someComponent, new Float(1.0f)); 
+0

Большое спасибо за этот ответ! Ответ имеет смысл для меня ... Но моя проблема в том, что я не очень хорош в программировании графического интерфейса, и я нашел не очень много об этом «relativeLayout» в Интернете. Можете ли вы помочь мне с небольшим примером? относительный макет внешнего класса, который я добавляю в свой проект? Надеюсь, вы можете мне помочь ... – Waldi

+0

@Waldi, Да, это внешний класс, который вам нужно скачать fr Ом ссылку, которую я вам доказал. – camickr

+0

Снова: A ** BIG ** спасибо! Вы решили мою 3-дневную проблему! С вашим маленьким примером я понял использование относительного макета. Большое спасибо! Существовать в stackoverflow системы рейтинга? Я хочу, как ваш профиль ... – Waldi

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