[JAVA] стиль GTKLookAndFeel

feliks28

Проблема в том, что при переключении в стиль GTKLookAndFeel, прекращает работу метод setBackground. И наверняка не только он.
Причем они не работают, даже если переключиться потом в windows или motif.
Исходник программы в следующем сообщении. Если непонятно сказал, то запустите и пощелкайте по кнопкам.

feliks28



import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class ActionTest
{
public static void main(String args[])
{
ActionFrame frame = new ActionFrame;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show;
}
}
class ActionFrame extends JFrame
{
public ActionFrame
{
setTitle("ActionTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
ActionPanel aPanel = new ActionPanel(this);
StylePanel sPanel = new StylePanel(this);
Container contentPane = getContentPane;
contentPane.setLayout(new GridLayout(2, 1;
contentPane.add(aPanel);
contentPane.add(sPanel);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
class ActionPanel extends JPanel
{
public ActionPanel(JFrame parent)
{
String iconDir = "C:\\j2sdk\\java\\CoreJavaBook\\v1\\v1ch8\\ActionTest\\";
Action yellowAction = new ColorAction("Yellow", new ImageIcon(iconDir + "yellow-ball.gif" Color.YELLOW, parent);
Action blueAction = new ColorAction("Blue", new ImageIcon(iconDir + "blue-ball.gif" Color.BLUE, parent);
Action redAction = new ColorAction("Red", new ImageIcon(iconDir + "red-ball.gif" Color.RED, parent);
add(new JButton(yellowAction;
add(new JButton(blueAction;
add(new JButton(redAction;
InputMap imap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("ctrl Y" "panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl B" "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl R" "panel.red");
ActionMap amap = getActionMap;
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
//setBackground(new Color(0,0,0,0;
}
public class ColorAction extends AbstractAction
{
public ColorAction(String name, ImageIcon icon, Color c, JFrame pt)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, "Set color to " + name.toLowerCase;
putValue("color", c);
putValue("parent", pt);
}
public void actionPerformed(ActionEvent event)
{
Color c = (Color)getValue("color");
JFrame pt = (JFrame)getValue("parent");
Container content = pt.getContentPane;
Component[] components = content.getComponents;
for(int i = 0; i < components.length; i++)
{
components[i].setBackground(c);
}
//pt.setBackground(c);
}
}
}
class StylePanel extends JPanel
{
public StylePanel(JFrame parent)
{
String iconDir = "C:\\j2sdk\\java\\CoreJavaBook\\v1\\v1ch8\\ActionTest\\";
Action winAction = new StyleAction("Windows", winStyle, parent);
Action motifAction = new StyleAction("Motif", motifStyle, parent);
Action gtkAction = new StyleAction("GTK", gtkStyle, parent);
add(new JButton(winAction;
add(new JButton(motifAction;
add(new JButton(gtkAction;
InputMap imap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("ctrl W" "panel.win");
imap.put(KeyStroke.getKeyStroke("ctrl M" "panel.motif");
imap.put(KeyStroke.getKeyStroke("ctrl G" "panel.gtk");
ActionMap amap = getActionMap;
amap.put("panel.win", winAction);
amap.put("panel.motif", motifAction);
amap.put("panel.gtk", gtkAction);
//setBackground(new Color(0,0,0,0;
}
public class StyleAction extends AbstractAction
{
public StyleAction(String name, String p, JFrame pt)
{
putValue(Action.NAME, name);
putValue(Action.SHORT_DESCRIPTION, "Set style to " + name);
putValue("path", p);
putValue("parent", pt);
}
public void actionPerformed(ActionEvent event)
{
String p = (String)getValue("path");
JFrame pt = (JFrame)getValue("parent");
try
{
UIManager.setLookAndFeel(p);
SwingUtilities.updateComponentTreeUI(pt);
}
catch(Exception e)
{
e.printStackTrace;
}
}
}
//private JFrame parent;
private String winStyle = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
private String motifStyle = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
private String gtkStyle = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
}

feliks28

И еще пара вопросов :
Можно ли вернуться к стилю который установливается по умолчанию?
И у меня там в первом actionPerformed используется извращение


JFrame pt = (JFrame)getValue("parent");
Container content = pt.getContentPane;
Component[] components = content.getComponents;
for(int i = 0; i < components.length; i++)
{
components[i].setBackground(c);
}
//pt.setBackground(c);


Почему приходится делать так, а не как в закомментированной строке?
Оставить комментарий
Имя или ник:
Комментарий: