2013-02-13 5 views
0

Я хочу создать строку состояния с текстовой панелью, индикатором выполнения, а что нет. Тем не менее, дела обстоят глупо.JLabel resizing JPanel

На первый у меня был только текст бар и строка состояния выглядела как в приведенном ниже примере (мне не нужен родительский контейнер):

import java.awt.BorderLayout; 
import java.awt.Dimension; 

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

public class Main 
{ 
    public static void main(String[] args) 
    {   
     //Display actual GUI 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Gui(); 
      } 
     }); 
    } 
} 

class Gui 
{ 
    public Gui() 
    { 
     JFrame masterWindow = new JFrame(); 

     masterWindow.setSize(1100, 800); 
     masterWindow.setMinimumSize(new Dimension(400, 400)); 
     masterWindow.setLocationRelativeTo(null); 
     masterWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel rootPanel = new JPanel(); 
     rootPanel.setLayout(new BorderLayout()); 

     StatusBar statusBar = new StatusBar(); 
     rootPanel.add(statusBar, BorderLayout.SOUTH); 

     masterWindow.setContentPane(rootPanel); 
     masterWindow.setVisible(true); 
    } 
} 

class StatusBar extends JLabel 
{ 
    private static final long serialVersionUID = 1L; 

    StatusBar() 
    { 
     super("welcomeText"); 
     add(textBar); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

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

Это не так, как эта установка требует больше пространства по вертикали:

public class StatusBar extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 

    StatusBar() 
    { 
     super(); 

     JLabel textBar = new JLabel(Main.language.getString("welcomeText")); 
     add(textBar); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

Почему это происходит, и как это остановить?

EDIT: BorderLayout действительно работал, но я хотел использовать MigLayout.

Я понял, но сейчас возникает другая проблема. Дополнительный progresBar не будет закрепляться на востоке, а разделитель даже не виден.

Вот код:

public class StatusBar extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 
    JLabel textBar; 
    JProgressBar progressBar; 

    StatusBar() 
    { 
     setLayout(new MigLayout("insets 0, gap 0!")); //Mig has some gaps inbetween components, this will remove the gaps 

     textBar = new JLabel(Main.language.getString("welcomeText")); 

     progressBar = new JProgressBar(0, 100); 

     JSeparator separator = new JSeparator(SwingConstants.VERTICAL); 

     add(textBar); 
     add(separator); 
     add(progressBar, "east"); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

Я могу сделать это новый вопрос, но я не думаю, что это стоит ...

+0

почему бы вам не взглянуть на исходный код или возможно запустить этот код через отладчик? – mre

ответ

1

Его потому, что вызов super() будет выполнять конструктор no-arg суперкласса, в вашем случае JPanel. Согласно javadoc

JPanel() - Создает новый JPanel с двойным буфером и раскладкой потока.

Итак, когда вы позвонили super(), создается JPanel с FlowLayout.

Попробуйте изменить расположение к BorderLayout

1

Установите расположение JPanel в BorderLayout

class StatusBar extends JPanel 
    { 
     private static final long serialVersionUID = 1L; 

     StatusBar() 
     { 
      super(); 
      this.setLayout(new BorderLayout()); //set layout 
      JLabel textBar = new JLabel(Main.language.getString("welcomeText")); 
      add(textBar); 

      setOpaque(true); 
      setBorder(BorderFactory.createLoweredBevelBorder()); 
     } 
    } 
+0

Хорошо, это работает, хотя и не для меня, так как мне понадобится более мощный макет. НО, что более важно, это не говорит ПОЧЕМУ. – Karlovsky120

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