2016-03-07 2 views
1

Я пытаюсь закодировать свою программу, чтобы все компоненты на моем JFrame имели согласованную цветовую схему. Чтобы это сделать, я хотел использовать цикл Java для каждого цикла, чтобы влиять на каждый компонент того же типа. Я пробовал это так, чтобы покрасить JPanels, но это не повлияло.Java - выберите все компоненты GUI типа

public void colourGUI() 
{ 
    for (Component comp : this.getComponents()) 
    { 
     if (comp instanceof JPanel) 
     { 
      ((JPanel) comp).setOpaque(true); 
      comp.setBackground(Color.gray); 
     } 
    } 
} 

Я бы подумал, что это сработает, но когда я загрузил приложение, оно не повлияло. Я достаточно новичок в Java, и ранее я использовал C# для таких программ, где использовал бы метод C# OfType<>. Я надеялся, что у Java будет какой-то эквивалент, но я еще ничего не нашел.

Может ли кто-нибудь указать мне в правильном направлении, чтобы выполнить то, что я ищу? Я думаю, что я пропустил что-то действительно очевидное!

Спасибо, Марк

+0

Возможно, вы не используете 'repaint()' и 'revalidate()'? – Dan

+0

Привет, как я уже сказал, я не слишком разбираюсь в методах Java. Когда же мне нужно будет их использовать? @Dan – marcuthh

+0

Я только что написал ответ. Если он не работает, напишите комментарий – Dan

ответ

2

Я извиняюсь за мой первый ответ. Как показано в этом примере, ваш код,

public void colourGUI() 
{ 
    for (Component comp : this.getComponents()) 
    { 
     if (comp instanceof JPanel) 
     { 
      ((JPanel) comp).setOpaque(true); 
      comp.setBackground(Color.gray); 
     } 
    } 
} 

, не работает без изменений.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.event.*; 
import java.awt.Color.*; 
import java.io.IOException; 
import java.lang.*; 
import java.util.*; 

public class Test extends JFrame { 
    private Box boxHolder; 
    private JPanel scrollPaneContainer; 

    Test(int i) { 
     super("Test Frame"); 
     this.setLayout(new BorderLayout()); 
     this.getContentPane().add(initScrollPane(),BorderLayout.CENTER); 
     this.getContentPane().add(initButtonAdd(),BorderLayout.SOUTH); 

     for(int j = 0; j < i; j++) { 
      boxHolder.add(createPanel()); 
     } 

     this.setLocationRelativeTo(null); 
     this.pack(); 
     this.setVisible(true); 
    } 

    private Component initButtonAdd() { 
     JButton button = new JButton("Recolour"); 
     button.setBackground(Color.green); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       for (Component comp : boxHolder.getComponents()) 
       { 
        if (comp instanceof JPanel) 
        { 
         ((JPanel) comp).setOpaque(true); 
         comp.setBackground(Color.gray); 
        } 
       } 
      } 
     }); 
     return button; 
    } 

    private Component initScrollPane() { 
     scrollPaneContainer = new JPanel(new BorderLayout()); 
     boxHolder = Box.createVerticalBox(); 
     scrollPaneContainer.add(boxHolder, BorderLayout.PAGE_START); 
     JScrollPane jSP = new JScrollPane(scrollPaneContainer); 
     jSP.getVerticalScrollBar().setUnitIncrement(16); 
     return jSP; 
    } 

    private Component createPanel() { 
     JPanel panel = new JPanel(); 
     panel.setBackground(randomColor()); 
     panel.setPreferredSize(new Dimension(100,50)); 
     panel.add(new JLabel("a colored Panel")); 
     panel.addMouseListener(new MouseListener() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       int indexPosition = boxHolder.getComponentZOrder(panel); 
       try 
       { 
        boxHolder.remove(indexPosition); 
       } 
       catch(Exception ex){} 
       try //Will only add here if you have a component in index position 1 
       { 
        boxHolder.add(createPanel(),indexPosition); 
       } 
       catch(Exception ex){} 
       scrollPaneContainer.revalidate(); 
      } 
      @Override public void mousePressed(MouseEvent e) {} 
      @Override public void mouseReleased(MouseEvent e) {} 
      @Override public void mouseEntered(MouseEvent e) {} 
      @Override public void mouseExited(MouseEvent e) {} 
     }); 
     return panel; 
    } 

    private Color randomColor() { 
     Random rand = new Random(); 
     float r = rand.nextFloat()/2f ; 
     float g = rand.nextFloat()/2f; 
     float b = rand.nextFloat()/2f; 
     Color randomColor = new Color(r, g, b); 
     return randomColor; 
    } 

    public static void main(String[] args) { 
     new Test(6); 
    } 
} 

Можете ли вы опубликовать еще несколько кода из вашего графического интерфейса?

+0

Просто попробовал это и вообще ничего не изменил, есть ли что-то более фундаментальное, чем это могло бы быть? – marcuthh

+0

Прежде всего заказ должен быть revalidate() и repaint(). Однако нет необходимости делать это, поскольку компоненты Swing делают это автоматически при изменении свойства компонента. – camickr

0

Когда вы задаете вопрос о правильном SSCCE, который демонстрирует проблему. Базовый код выглядит разумным, но без SSCCE мы не можем определить контекст того, как этот код используется. Например, мы не знаем, к чему относится this.getComponents().

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

Структура рамки сложнее, чем вы думаете. Посмотрите на Using Top Level Containers для лучшего описания структуры.

Вы можете использовать класс Swing Utils, который использует рекурсию для получения всех дочерних компонентов заданного типа.

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