Мой вопрос немного странный.
Я хочу, чтобы цвет моей созданной формы (с JFrame) был похож на эту картинку:
Должен ли я использовать особый внешний вид?
Мой вопрос немного странный.
Я хочу, чтобы цвет моей созданной формы (с JFrame) был похож на эту картинку:
Должен ли я использовать особый внешний вид?
Должен ли я использовать особый внешний вид?
Насколько я знаю, такого встроенного Look&Feel нет. Однако для «Look&Feel» «Look» относится к внешнему виду виджетов GUI (более формально, JComponents), а «feel» относится к тому, как ведут себя виджеты. Если это так, то мы всегда можем сделать так, чтобы наш компонент Swing отображался в графическом интерфейсе так, как мы хотим.
Усовершенствованные адаптивные приложения с богатой графикой источают крутость, втягивая пользователей с самого начала и цепляясь за них мертвой хваткой волнения. Они заставляют пользователей рассказывать своим друзьям о приложениях.
Однако для разработки графически богатого приложения Swing мы должны знать, как визуализировать пользовательскую графику на компоненте, чтобы она выглядела так, как мы хотим (с блестящим цветом, красивой текстурой, движущейся анимацией, красивой типографикой). Нам нужно научиться правильно размещать компоненты, чтобы располагать их друг относительно друга. Отвечая на ваши различные вопросы, я понял, что вы хотите быть любителем свинга. Что ж:
JPanel, JLabel, JButton, JList, JTable, JTextPane
и т. д.), а также различные типы слушателей событий и то, как они реагируют на компонент.Layout Managers
. Доступны другие менеджеры компоновки продвинутого уровня, которые облегчают жизнь, но сначала узнайте о стандартных менеджерах.Graphics
и Graphics2D
для визуализации кариеса. тип геометрического объекта, рендеринг изображения, текстурирование, градиентное рисование и т. д.А теперь демонстрационный пример для вас:
Я постарался сделать приложение максимально коротким и простым. Но есть кое-что, что я сделал для достижения запрошенного вами графического интерфейса, чего вам не следует делать, если вы не знаете, как они работают (например, переопределение функции paint()
). В этом примере мне не удалось собрать текстуру, как на изображении, которое вы предоставили. Но я использовал текстуру ткани. Приложению необходимо сначала загрузить изображение текстуры. следите за консолью. Перед запуском приложения будет отображаться следующее сообщение:
Подождите, идет загрузка текстуры: http://www.brewsterwallcovering.com/data/default/images/catalog/original/289-5757.jpg
Загрузка завершена. Запуск демо!
Я использовал: GridBagLayout
в качестве менеджера компоновки панели MainContainer. Внимательно изучите код и прочитайте о соответствующем расширении (расширяющем JCompononent и JButton) и рисунке, который я сделал для достижения более приятного графического интерфейса (ну, не так много лучше для многих критиков, но для DEMO....)
Исходный код демо:
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;
/// creating the Button with custom look
class CButton extends JButton
{
BasicStroke basicStroke = new BasicStroke(2.0f);
public CButton(String txt) {
super(txt);
setForeground(Color.WHITE);
setFont(getFont().deriveFont(Font.BOLD, 13));
setContentAreaFilled(false);
setBorder(null);
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(new Color(0xFFAA00));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(basicStroke);
int archH = (getHeight()-4)/2;
g2d.drawRoundRect(3, 3, getWidth()-4, getHeight()-4, archH, archH);
if(getModel().isRollover())
{
g2d.fillRoundRect(3, 3, getWidth()-4, getHeight()-4, archH, archH);
setForeground(Color.black);
}
else
{
setForeground(Color.white);
}
g2d.dispose();
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
}
}
/** creating the MainContainer panel with custom look **/
// custom painting to with paintComponent(Graphics g) and paint(Graphics g)
class MainContainer extends JPanel
{
public BufferedImage gradientImage = null;
public static BufferedImage textureImg; // made it static just for easyness
public static boolean loadingFinished = false;
public MainContainer() {
setBorder(new EmptyBorder(50, 50, 50, 50)); // setting the insets
// learn about GridBagLayout from the linked page about LayoutManager
setLayout(new GridBagLayout());
JLabel usrNameLabel = new JLabel("User Name");
changeCompFont(usrNameLabel);
JTextField usrNameFeild = new JTextField("user name");
changeCompFont(usrNameFeild);
// create compund border for text and password feild with left padding 5 px
Border compundBorder = BorderFactory.createCompoundBorder(
new LineBorder(Color.white, 2),
new EmptyBorder(2, 5, 2, 2));
usrNameFeild.setBorder(compundBorder);
usrNameFeild.setOpaque(false);
usrNameLabel.setLabelFor(usrNameFeild);
JLabel passwordLabel = new JLabel("Password");
changeCompFont(passwordLabel);
JPasswordField passFeild = new JPasswordField("Password");
changeCompFont(passFeild);
passFeild.setBorder(compundBorder);
passFeild.setOpaque(false);
passwordLabel.setLabelFor(passFeild);
// working with GridBagConstraints, please check out the linked online tutorial
GridBagConstraints labCnst = new GridBagConstraints();
GridBagConstraints txtCnst = new GridBagConstraints();
labCnst.insets = new Insets(0, 0, 5, 10);
txtCnst.insets = new Insets(0, 0, 5, 10);
labCnst.ipady = txtCnst.ipady = 10;
txtCnst.fill = labCnst.fill = GridBagConstraints.HORIZONTAL;
labCnst.gridx = 0;
txtCnst.gridx = 1;
labCnst.gridwidth = 1;
txtCnst.gridwidth = 2;
labCnst.weightx = 0.3;
txtCnst.weightx = 0.7;
txtCnst.gridy = labCnst.gridy = 0;
add(usrNameLabel, labCnst);
add(usrNameFeild, txtCnst);
txtCnst.gridy = labCnst.gridy = 1;
add(passwordLabel, labCnst);
add(passFeild, txtCnst);
labCnst.gridx = 2;
labCnst.gridy = 2;
labCnst.ipady = 13;
labCnst.insets = new Insets(0, 0, 0, 150);
JButton submitButt = new CButton("Log IN");
add(submitButt, labCnst);
}
public void changeCompFont(JComponent comp)
{
comp.setForeground(Color.WHITE);
comp.setFont(getFont().deriveFont(Font.BOLD, 13));
}
// To PAINT THE TEXTURE ABOVE THE COMPONENTS,
//DON'T DO IT UNTIL YOU UNDERSTAND PAINTING MECHANISM FULLY
@Override
public void paint(Graphics g) {
super.paint(g); //To change body of generated methods, choose Tools | Templates.
Graphics2D g2d = (Graphics2D)g.create(); // cloning to work, it is safer aproach
Rectangle2D txRect = new Rectangle2D.Double(0, 0, textureImg.getWidth(), textureImg.getHeight());
TexturePaint txPaint = new TexturePaint(textureImg, txRect);
g2d.setPaint(txPaint);
//make the texture transparent
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();// disposing the graphics object
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
Graphics2D g2d = (Graphics2D) g.create();
if(gradientImage==null || gradientImage.getHeight() != getHeight())
{
gradientImage = createGradientImg();
}
g2d.drawImage(gradientImage, 0, 0, getWidth(), getHeight(), this);
g2d.dispose();
}
public BufferedImage createGradientImg()
{
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
/// background gradient paint, linear gradient paint for the background
/// Gradient paint rendering could be made more optimized
LinearGradientPaint lgrPaint = new LinearGradientPaint(0.0f, 0.0f, getWidth(), getHeight(),
new float[] { 0.0f, 0.5f, 0.6f, 1.0f },
new Color[] { new Color(0x002AFF),
new Color(0x0CAAF9),
new Color(0x0CAAF9),
new Color(0x002AFF) });
Graphics2D g2d = (Graphics2D) image.getGraphics();
g2d.setPaint(lgrPaint);
//g2d.shear(0.2, 0);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
//g2d.drawImage(textureImg, 0, 0, getWidth(), getHeight(), null);
return image;
}
}
public class CustomApp {
public static void main(String[] args) throws IOException {
// load the texture resource image
System.out.println("Please wait, Loading Texture : http://www.brewsterwallcovering.com/data/default/images/catalog/original/289-5757.jpg");
MainContainer.textureImg = ImageIO.read(new URL("http://www.brewsterwallcovering.com/data/default/images/catalog/original/289-5757.jpg"));
System.out.println("Loading finished. Starting the Demo!");
MainContainer.textureImg = MainContainer.textureImg.getSubimage(0, 0, 200, 200);
// Starting the Swing GUI in the EDT, learn about it
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Demo: LogIn Dialogue");
// set frame size as Demo perposes, otherwise not recommended
frame.setSize(new Dimension(500, 300));
MainContainer container = new MainContainer();
frame.add(new MainContainer());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
Вы можете использовать JavaFX
, чтобы получить отличный внешний вид. Я думаю, что лучше использовать JavaFX, если вы ищете отличный дизайн в Java Swing, который также обеспечивает лучший внешний вид и анимацию. вы можете сослаться на эти ссылки, надеюсь, что это будет полезно для вас.
LinearGradientPaint
? Ты тоже хочешь ножницы? - person trashgod   schedule 23.10.2013shear
? - person Sajad   schedule 23.10.2013AffineTransform#shear()
и т. д. - person trashgod   schedule 23.10.2013