2013-04-05 3 views
2

Я любитель, пишущий карточку со стрельбой из лука. Программа работает хорошо, но за счет 19 разделов идентичного кода каждая из 18 строк. Я пытаюсь сконденсировать код с помощью вызова метода. Я использую Java SE6 и Mig LayoutJava Swing JLabels показывается в методе buildGUI, но не в том случае, если он добавлен из другого метода

Вот раздел кода в графическом интерфейсе, который работает. GUI называется ниже

HomePage (содержащий основной метод) -> ChoiceGUI -> buildScoresPanel

public void buildScoresPanelMIG(JPanel scoresPanel) {   

    for (row = 0; row<(int)numberofrows; row++){ 
     scoresPanel.add(scorelabel1[row],"gapleft 0,w 35px, hmin 35px,split 18"); 
     scoresPanel.add(scorelabel2[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
     scoresPanel.add(scorelabel3[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
     scoresPanel.add(scorelabel4[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
     scoresPanel.add(scorelabel5[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
     scoresPanel.add(scorelabel6[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
     //another 12 Jlabels    } 
    } 

Если, однако я поставил код в метод и назовите его, как показано ниже на JLabels не будет показать хотя я попытался перепроверить() перекрасить() и SetVisible (истина)

public void buildScoresPanelMIG(JPanel scoresPanel) { 

      for (row = 0; row<(int)numberofrows; row++){ 

       addScoreLabels(); 

      } 
    } 

    public void addScoreLabels(){ 

    scoresPanel.add(scorelabel1[row],"gapleft 0,w 35px, hmin 35px,split 18"); 
    scoresPanel.add(scorelabel2[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
    scoresPanel.add(scorelabel3[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
    scoresPanel.add(scorelabel4[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
    scoresPanel.add(scorelabel5[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
    scoresPanel.add(scorelabel6[row],"gap before 0px,gapleft 0,w 35px, hmin 35px"); 
    //another 12 labels 
    //scoresPanel.revalidate(); 
    //scoresPanel.repaint(); 
    //scoresPanel.setVisible(true); 
    } 

Я тралили интернет долгого времени пытается решить эту проблему, и я понимаю, что у меня есть фундаментальное непонимание того, как Компоненты Swing работают и были бы благодарны, если бы кто-то мог объяснить.

+2

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org). Как бы то ни было, мы в значительной степени должны быть дикими гуру, чтобы понять ваш код, и это становится еще хуже, поскольку мы пытаемся понять, какую ошибку вы совершили. –

+1

Ваша первая подпись метода - 'public void buildScoresPanelMIG (JPanel scoresPanel)', а вторая вторая не принимает параметр JPanel в качестве параметра. Означает ли это, что «JPanel» является полем этого класса? – christopher

ответ

0

Попробуйте прохождение scoresPanel в качестве аргумента в ваш метод addScoreLabels() тоже:

addScoreLabels(scoresPanel); 

... 

public void addScoreLabels(JPanel scoresPanel) { ... 

Как Крис Куни указывает в комментариях, вы, вероятно, имеют различные панели, хранящуюся в переменной в scoresPanel поле, которое в настоящее время спрятанный локальная переменная в первом методе, но не во втором.

1

Я считаю, что ваши ограничения компонентов являются незаконными (в дополнение к возможным другим причинам). Это основные ресурсы относительно MigLayout, что мне удалось найти:

шпаргалка является вашим лучшим другом, хотя это не помешает прочитать технический документ и загружать и просматривать удобные демонстрации. Если вы посмотрите на чит-лист, вы увидите, что вы в основном пытались установить одно и то же в нескольких разных (возможно, несовместимых) способах.

Я сделал SSCCE для динамического добавления/удаления ярлыка из управляемой JPMel MigLayout. Он был построен с MigLayout 3.7.4.

Скриншот: MigLayout add remove debug test SSCCE

Код:

public class App extends JFrame { 

public JPanel mainPanel; 
public int addedCount = 1; 
public final int initRowsCount = 8; 
public final int columnsCount = 5; 

public App() { 
    super("MiGLayout test"); 
    initUI();  
} 

private void redrawMainPanel() {   
    mainPanel.revalidate(); 
    mainPanel.repaint(); 
} 

private JMenuBar initMenuBar() { 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("test menu"); 
    JMenuItem removeMenuItem = new JMenuItem("remove a component"); 
    JMenuItem addMenuItem = new JMenuItem("add a component"); 
    JCheckBoxMenuItem debugMenuItem = new JCheckBoxMenuItem("debug mode"); 
    removeMenuItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (mainPanel.getComponentCount() > 0) { 
       mainPanel.remove(mainPanel.getComponents()[mainPanel.getComponentCount() - 1]); 
       --addedCount; 
      } 
      App.this.redrawMainPanel(); 
     } 
    }); 
    addMenuItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      mainPanel.add(
         initLabel(addedCount/columnsCount, addedCount % columnsCount), 
         (addedCount % columnsCount == columnsCount - 1 ? "grow 35, wrap" : "grow 35") 
         ); 
      ++addedCount; 
      App.this.redrawMainPanel(); 
     } 
    }); 
    debugMenuItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      MigLayout migLayout = ((MigLayout)mainPanel.getLayout()); 
      String lc = (String)migLayout.getLayoutConstraints(); 
      if (lc.contains("debug")) { 
       lc = lc.substring(0, lc.lastIndexOf(',')); 
      } 
      else { 
       lc += ",debug"; 
      } 
      migLayout.setLayoutConstraints(lc); 
      App.this.redrawMainPanel(); 
     } 
    }); 
    menu.add(addMenuItem); 
    menu.add(removeMenuItem); 
    menu.add(debugMenuItem); 
    menuBar.add(menu); 
    return menuBar; 
} 

private JLabel initLabel(int i,int j) { 
    JLabel label = new JLabel("label " + i + " " + j);   
    label.setHorizontalAlignment(JLabel.CENTER); 
    label.setBorder(BorderFactory.createEtchedBorder());  
    return label; 
} 
private JPanel initMainPanel() { 
    JPanel panel = new JPanel(); 
    panel.setLayout(new MigLayout("nogrid, fill, debug")); 
    JLabel label; 
    for (int i = 0; i < initRowsCount; i++) { 
     for (int j = 0; j < columnsCount; j++) {     
      panel.add(initLabel(i, j), (j == columnsCount - 1 ? "grow 35, wrap" : "grow 35")); 
      ++addedCount; 
     } 
    } 
    addedCount--; 
    return panel; 
} 

public void initUI() { 
    this.setPreferredSize(new Dimension(1024, 768)); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setJMenuBar(initMenuBar()); 
    this.getContentPane().add(mainPanel = initMainPanel()); 
    this.setLocationByPlatform(true); 
    this.pack();   
} 

public static void main(String[] args) {  
    // SwingUtilities.invokeLater 
    // or 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new App().setVisible(true);  ; 
     } 
    }); 
} 
} 

MigLayout имеет два или три режима работы, которые установлены в качестве ограничений макета - конструктора аргумента MigLayout. Основными режимами являются режим сетки и потока (ограничение размещения nogrid).

Если я правильно помню, в режиме сетки вам нужно определить хотя бы одно измерение (строки, столбцы) и иметь несколько способов сделать это в вашем распоряжении (макет, ограничения строк и столбцов, по крайней мере).Тогда есть два режима: вы можете добавлять компоненты с координатами ячеек и без них.

Режим только для потока эквивалентен системе визуального форматирования веб-браузера: встроенные элементы выложены в строке (например, тег HTML span), в то время как элемент блока начинается со следующей строки (например, HTML div) , Компонентное ограничение wrap разбивает строку - помещает следующий компонент в следующую строку.

Ограничение компоновки debug рисует красную и синюю линии, которые представляют собой границы макета и компонента, соответственно.

fill Схема ограничения:

претензий все доступное пространство в контейнере для столбцов и/или строк. По крайней мере, один компонент должен иметь «растущую» константу для заполнения контейнера. Пространство будет разделено на равные, хотя и соблюдая «прирост». Если ни один столбец/строки не имеет «расти», вес роста компонентов в строках/столбцах будет мигрировать в эту строку/столбец.

grow компонент ограничение (может быть использован в качестве строк/столбцов ограничения также):

Устанавливает, насколько сильно компонент должен быть расти по отношению к другому компоненту в той же самой клетке. Вес (по умолчанию 100, если не указан) является чисто относительным значением веса других компонентов. В два раза больше веса удваивается. Если это ограничение не установлено, вес роста устанавливается равным 0, и компонент не будет расти (если в строке/столбце не задано значение fill, в этом случае «рост 0» можно использовать, чтобы явно не увеличивать его). Рост веса будет сравниваться только с весами в той же группе приоритетов роста и для одной и той же ячейки. Смотри ниже.

Таким образом, изменение размера рамки не может испортить макет, так как все они растут одинаково. Существует еще много способов достижения самых разных макетов. Кажется, что «один менеджер макетов управляет ими всеми». Если у вас есть сомнения, загрузите демоверсии. Существует даже пример анимации. Отличный выбор технологии для любителя;).