цветовая схема JDialog

Модератор: Absurd

Ответить
Genix
Сообщения: 4
Зарегистрирован: 15 ноя 2005, 10:00

Подскажите, как правильно изменить цветовую схему отдельно-взятого окна? Хочется выделить цветом вспомогательные окна (JDialog), не меняя при этом фон/цвет элементов главного окна приложения.

J2SE1.5/SWING
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Genix, а можно поинтересоваться, что такое "цветовая схема"?
и как её можно изменить для всего приложения вместе?

Я так понимаю, что примитивный вариант:

Код: Выделить всё

JDialog dialog = new JDialog();
dialog.setBackground(Color.RED);
не подойдёт?

А если хочется выделить лишь определённые "вспомогательные" окна, то можно:

Код: Выделить всё

public class AuxiliaryDialog extends JDialog{
//...
void init(... ) {
setBackground(Color.RED);
//...
}
и от него уже инстанциировать то, что требуется.

Но это примитивная работа с цветом.
А что подразумевается под "цветовой схемой" ?
Genix
Сообщения: 4
Зарегистрирован: 15 ноя 2005, 10:00

Oscar писал(а):Genix, а можно поинтересоваться, что такое "цветовая схема"?
и как её можно изменить для всего приложения вместе?
Look'n'Feel например ]
Я так понимаю, что примитивный вариант:

Код: Выделить всё

JDialog dialog = new JDialog();
dialog.setBackground(Color.RED);
не подойдёт?
[/quote]

нет, не подходит.
ибо все добавляемые в этот Dialog Panel'ы имеют цвет по умолчанию, вместо Color.RED
А если хочется выделить лишь определённые "вспомогательные" окна, то можно:

Код: Выделить всё

public class AuxiliaryDialog extends JDialog{
//...
void init(... ) {
setBackground(Color.RED);
//...
}
и от него уже инстанциировать то, что требуется.

Но это примитивная работа с цветом.
то же самое, все добавляемые JPanel'ы имеют свой цвет фона
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

 JDialog dialog = new JDialog();
    dialog.setUndecorated(true);
    dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
так?

JComponent.setUI(ComponentUI newUI)

или так?
Genix
Сообщения: 4
Зарегистрирован: 15 ноя 2005, 10:00

Oscar писал(а):

Код: Выделить всё

 JDialog dialog = new JDialog&#40]

так?
[/quote]

не совсем. ;)
в этом случае просто появляется "дурняковое" обрамление окна


[quote]
[url=http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComponent.html#setUI(javax.swing.plaf.ComponentUI)]JComponent.setUI(ComponentUI newUI)[/url]

или так?[/quote]

не понял как его готовить.
для getRootPane/JPanel setUI не доступен, а для каждого элемента по отдельности.... Думал может есть метод, убивающих всех зайцев одним выстрелом ;) ))
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

import java.awt.Point;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Sample extends JDialog {
  
private static final long serialVersionUID = 1L;

private JPanel jp = new JPanel();

  public Sample(int type, String name)
  {
	  this.setTitle(name);
	  
    try
    {
    	switch(type) {
    		case 1:
    			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    			break;
    		case 2:
    			UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
    			break;
    		case 3:
    			UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    			break;
    		default:
    			UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    	}
   		
    	
    }
    catch(Exception e){e.printStackTrace();};
    jp.add(new JLabel("label"));
    jp.add(new JButton("button"));
    setContentPane(jp);
  }
  
  public static void showDialog(int type) {
	  
	  String name = "crossPlatform";
	  Point location = new Point(0, 0);
	  
	  switch(type) {
		case 1:
			name = "windows";
			location = new Point(400, 0);
			break;
		case 2:
			name = "motif";
			location = new Point(0, 300);
			break;
		case 3:
			name = "metal";
			location = new Point(400, 300);
			break;
		default:
			name = "crossPlatform";
			location = new Point(0, 0);
	}
	  
	  Sample s = new Sample(type, name);
	    s.addWindowListener(new WindowAdapter()
	      {
	        public void windowClosing(WindowEvent e)
	        {
	          System.exit(0);
	        }
	      });
	    s.setSize(400, 300);
	    s.setLocation(location);
	    s.setVisible(true);  
  }

  public static void main(String[] args)
  {
    Sample.showDialog(1);
    Sample.showDialog(2);
    Sample.showDialog(3);
    Sample.showDialog(0);
  }
}

А хоть так пойдёт? ...

WindowsLookAndFeel наверное лучше не использовать, т.к. повредит кроссплатформености.
А остальные, как бы, входят в swing, потому думаю, что должны поддерживаться везде (могу и ошибаться).


Offtopic: С какой бы радостью вместо своей HTTP Авторизации на PHP я бы сейчас занимался вот таким вот расскрашиванием окошек ...
Genix
Сообщения: 4
Зарегистрирован: 15 ноя 2005, 10:00

Oscar писал(а): А хоть так пойдёт? ...
судя по тому, что оно делает ДА.
пытаюсь вспомнить, почему у меня не получилось сделать тоже самое ;) ))
Ответить