2013-05-30 3 views
2

Я почти слепой после прочтения нескольких статей java swing и до сих пор не могу заставить панель работать.
Когда я добавляю 2 JLabels, они красиво выровнены влево, с дополнением 5px, определенным EmptyBorder, так же, как я хочу, чтобы они были.JLabel неуместен после добавления JPanel

enter image description here

Я обнаружил, что после добавления ProgressBar с дополнительной границей для заполнения, не работает, как ожидалось, добавил еще 1 панель, где я добавить ProgressBar. Прогресс выглядит неплохо, но все мои ярлыки смещены.
И, наконец, он выглядит следующим образом (RED фон для отладки, чтобы увидеть, как JPanel рисует): enter image description here

Question1: Как это исправить?
Question2: Это стандартный подход для качания, чтобы разместить панель внутри другой панели с другими панелями, чтобы получить форму, я хочу?



Источник:

public class AppInitProgressDialog { 
    private static final int  VIEW_PADDING_VAL = 5; 
    private static final Border  viewPaddingBorder = new EmptyBorder(VIEW_PADDING_VAL, VIEW_PADDING_VAL, VIEW_PADDING_VAL, VIEW_PADDING_VAL); 

    private JPanel   view; // Dialog view 
    private JPanel   panel; 

    private JPanel   progressPanel; 

    private JLabel   title; 
    private JLabel   progressDesc; 
    private JProgressBar progressBar; 

    private void initPanel(int w, int h) { 
     view = new JPanel(); 
     view.setBorder(BorderFactory.createRaisedSoftBevelBorder()); 
     view.setBackground(Color.LIGHT_GRAY); 
     view.setSize(w, h); 
     view.setLayout(new BorderLayout()); 

     panel = new JPanel(); 
     panel.setBorder(viewPaddingBorder); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
     //panel.setLayout(new SpringLayout()); 
     panel.setOpaque(false); 

     JFrame parent = AppContext.getMe().getAppWindow().getFrame(); 
     int posx = (parent.getWidth() - w)/2; 
     int posy = (parent.getHeight() - h)/2; 
     view.add(panel, BorderLayout.CENTER); 
     view.setLocation(posx, posy); 
    } 

    private void initTitle() { 
     title = new JLabel("Progress title"); 
     title.setAlignmentX(JComponent.LEFT_ALIGNMENT); 
     panel.add(title); 
    } 

    private void initProgress() { 
     progressPanel = new JPanel(new BorderLayout()); 
     progressPanel.setBackground(Color.LIGHT_GRAY); 
     progressPanel.setBorder(new EmptyBorder(15, 30, 15, 30)); 
     progressPanel.setBackground(Color.RED); 

     progressBar = new JProgressBar(0, 10000); 
     progressBar.setStringPainted(true); 
     progressBar.setAlignmentX(JComponent.LEFT_ALIGNMENT); 
     progressPanel.add(progressBar); 

     panel.add(progressPanel); 
     progressDesc = new JLabel("Progress description"); 
     panel.add(progressDesc); 
    } 

    public AppInitProgressDialog() { 
     initPanel(400, 100); 
     initTitle(); 
     initProgress(); 
    } 

    public JComponent getView() { 
     return view; 
    } 
} 
+2

Я рекомендую редактирование вопроса и удаление будущее Вопроса 3. Это не имеет никакого отношения к первоначальному вопросу в названии. – sm4

ответ

1

В качестве альтернативы, вы можете использовать BorderLayout для panel:

panel = new JPanel(new BorderLayout()); 
... 
panel.add(title, BorderLayout.NORTH); 
... 
panel.add(progressPanel); // default CENTER 
... 
panel.add(progressDesc, BorderLayout.SOUTH); 

image

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.border.EmptyBorder; 

/** 
* @see http://stackoverflow.com/a/16837816/230513 
*/ 
public class Test { 

    private JFrame f = new JFrame("Test"); 

    private void display() { 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new AppInitProgressDialog().getView()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    class AppInitProgressDialog { 

     private static final int VIEW_PADDING_VAL = 5; 
     private JPanel view; // Dialog view 
     private JPanel panel; 
     private JPanel progressPanel; 
     private JLabel title; 
     private JLabel progressDesc; 
     private JProgressBar progressBar; 

     private void initPanel(int w, int h) { 
      view = new JPanel(); 
      view.setBorder(BorderFactory.createRaisedBevelBorder()); 
      view.setBackground(Color.LIGHT_GRAY); 
      view.setSize(w, h); 
      view.setLayout(new BorderLayout()); 

      panel = new JPanel(new BorderLayout()); 
      panel.setBorder(BorderFactory.createLineBorder(Color.blue)); 
      panel.setOpaque(false); 

      view.add(panel, BorderLayout.CENTER); 
     } 

     private void initTitle() { 
      title = new JLabel("Progress title"); 
      title.setAlignmentX(JComponent.LEFT_ALIGNMENT); 
      panel.add(title, BorderLayout.NORTH); 
     } 

     private void initProgress() { 
      progressPanel = new JPanel(new BorderLayout()); 
      progressPanel.setBackground(Color.LIGHT_GRAY); 
      progressPanel.setBorder(new EmptyBorder(15, 30, 15, 30)); 
      progressPanel.setBackground(Color.RED); 

      progressBar = new JProgressBar(0, 10000); 
      progressBar.setStringPainted(true); 
      progressBar.setAlignmentX(JComponent.LEFT_ALIGNMENT); 
      progressPanel.add(progressBar); 

      panel.add(progressPanel); 
      progressDesc = new JLabel("Progress description"); 
      panel.add(progressDesc, BorderLayout.SOUTH); 
     } 

     public AppInitProgressDialog() { 
      initPanel(400, 100); 
      initTitle(); 
      initProgress(); 
     } 

     public JComponent getView() { 
      return view; 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
} 
1

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

panel.setLayout(new GridLayout(1,1,0,0)); 

Подробнее о макете см. Здесь tutorial.

+0

Так жаль, что я могу только отметить один ответ как правильный, и после того, как какая-то сетка trie out также будет работать, но ответ @trashgod звучит скорее как способ сделать это. Надежда «за голосом» будет называться, поскольку вы как-то ответили на мой второй вопрос, ведьма звучит так: «Используйте макеты над панелями». благодаря –

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