Цвет JFrame должен соответствовать этой картинке

Мой вопрос немного странный.

Я хочу, чтобы цвет моей созданной формы (с JFrame) был похож на эту картинку:

введите здесь описание изображения

Должен ли я использовать особый внешний вид?


person Sajad    schedule 22.10.2013    source источник
comment
L & F нет, другая ситуация будет в случае, если вы хотите использовать другую цветовую схему для панели инструментов (например, цветовую схему acrulat, используемую для NativeOS) и кнопок (минимум, максимум (восстановить), закрыть), но вы можете смоделировать эту функциональность, все с неукрашенным контейнером верхнего уровня   -  person mKorbel    schedule 22.10.2013
comment
Может LinearGradientPaint? Ты тоже хочешь ножницы?   -  person trashgod    schedule 23.10.2013
comment
@trashgod Что значит shear?   -  person Sajad    schedule 23.10.2013
comment
@mKorbel можешь объяснить понятнее? Или привести пример?   -  person Sajad    schedule 23.10.2013
comment
@Sajjad: Как в AffineTransform#shear() и т. д.   -  person trashgod    schedule 23.10.2013
comment
Вы имеете в виду, что хотите, чтобы эта картина была окном? Непонятно, о чем вы спрашиваете; попробуй уточнить.   -  person Justin    schedule 27.10.2013


Ответы (2)


Должен ли я использовать особый внешний вид?

Насколько я знаю, такого встроенного Look&Feel нет. Однако для «Look&Feel» «Look» относится к внешнему виду виджетов GUI (более формально, JComponents), а «feel» относится к тому, как ведут себя виджеты. Если это так, то мы всегда можем сделать так, чтобы наш компонент Swing отображался в графическом интерфейсе так, как мы хотим.

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

Однако для разработки графически богатого приложения Swing мы должны знать, как визуализировать пользовательскую графику на компоненте, чтобы она выглядела так, как мы хотим (с блестящим цветом, красивой текстурой, движущейся анимацией, красивой типографикой). Нам нужно научиться правильно размещать компоненты, чтобы располагать их друг относительно друга. Отвечая на ваши различные вопросы, я понял, что вы хотите быть любителем свинга. Что ж:

  • Во-первых, узнайте о Swing JComponent(JPanel, JLabel, JButton, JList, JTable, JTextPane и т. д.), а также различные типы слушателей событий и то, как они реагируют на компонент.
  • Во-вторых, узнайте о Layout Managers . Доступны другие менеджеры компоновки продвинутого уровня, которые облегчают жизнь, но сначала узнайте о стандартных менеджерах.
  • В-третьих, узнайте об рендеринге пользовательской графики в Swing. компоненты и маятниковый покрасочный механизм. Затем о концепции шрифта.
  • В-четвертых, узнайте о классе Graphics и Graphics2D для визуализации кариеса. тип геометрического объекта, рендеринг изображения, текстурирование, градиентное рисование и т. д.
  • Пять. Узнайте о параллелизме в Swing. Swing не является потокобезопасным, он поддерживает однопоточные правила. Требуется хорошее знание многопоточности, StackOverflow почти каждый день переполняется проблемами с многопоточностью в Swing.
  • Шесть, соберите книгу Грязно богатые клиенты и внимательно прочитайте ее, когда почти закончите все вышеперечисленное.

А теперь демонстрационный пример для вас:

Я постарался сделать приложение максимально коротким и простым. Но есть кое-что, что я сделал для достижения запрошенного вами графического интерфейса, чего вам не следует делать, если вы не знаете, как они работают (например, переопределение функции 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);

            }
        });
    }
}
person Sage    schedule 27.10.2013
comment
Ссылка на изображение больше не работает, поэтому я посмотрел на веб-сайт, взял что-то другое и сразу же преуспел: bhf-cdn.azureedge.net/bhf-blob-prod/ Возможно, вы найдете более подходящее изображение с градиентом и, возможно, сможете его загрузить к хранилищу изображений SE? - person user unknown; 23.10.2020

Вы можете использовать JavaFX, чтобы получить отличный внешний вид. Я думаю, что лучше использовать JavaFX, если вы ищете отличный дизайн в Java Swing, который также обеспечивает лучший внешний вид и анимацию. вы можете сослаться на эти ссылки, надеюсь, что это будет полезно для вас.

начало работы с FXML

Swing с JavaFX

person Not a bug    schedule 28.10.2013
comment
серьезно! Можете ли вы дать мне какую-нибудь ссылку на приложения среднего веса, требующие проверки вводимых пользователем данных или настольных приложений бизнес-модели, которые используют JavaFx для расширенных настраиваемых look&Feel, встроенных в Swing. Или его родственная часть SilverLight/Flash с настольными приложениями Windows, которые родились раньше, чем javaFx. Я действительно хочу иметь технологию, которая делает жизнь проще, чем жить со свойством свинга и его пользовательским контролем ввода, манипулированием текстом/графикой. смешивание JavaFx с Swing) может упростить - ну, это то, что существование такой реализации ответит без аргументов. - person Sage; 28.10.2013
comment
Вот приведены примеры использования JavaFX. Надеюсь, это будет полезно для вас. - person Not a bug; 29.10.2013
comment
@KishanSarsechaGajjar, это демонстрационный пример, созданный для обучения Как делать что-то в JavaFx, я попросил полностью запустить программное приложение среднего веса, которое использует JavaFx или смесь свинга и javaFx для достижения продвинутого уровня внешнего вида. - person Sage; 30.10.2013
comment
@Sage Сейчас я изучаю JavaFX следующего уровня. Все, что я знаю, это то, что с интеграцией JavaFX и Swing эффективнее и проще реализовать предварительный дизайн и Look and Feel. но я буду информировать вас в будущем. - person Not a bug; 30.10.2013
comment
@KishanSarsechaGajjar, спасибо. Буду ждать и обязательно вас послушаю :) - person Sage; 30.10.2013
comment
@Sage инструмент JavaFX SceneBuilder хороший пример приложения JavaFX коммерческого качества. Было бы неплохо иметь демонстрацию JavaFX, подобную витрине NetBeans, но это не существуют, самым близким в настоящее время является (очень короткий список) Примеры использования в реальных условиях на странице сообщества JavaFX. - person jewelsea; 27.01.2015