Как вы создаете градиент для JPanel? Кроме того, как вы называете класс в классе в Java? - PullRequest
0 голосов
/ 11 ноября 2019

Я делаю графический интерфейс Java и 2 часа искал в интернете, как сделать градиент для JPanel. Код ниже, что у меня есть, но при запуске градиент не показывает. Что не так?

Я пробовал много других постов с похожими вопросами по этому вопросу в Интернете, но они не работают. Я пробовал множество версий, но я также точно не знаю, как запустить класс в классе. Может кто-нибудь помочь мне, пожалуйста?

class TestPanel extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        int w = getWidth();
        int h = getHeight();
        Color color1 = Color.BLUE;
        Color color2 = Color.GREEN;
        GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }
} //this is nested within the main class

// некоторый код

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
        CreateGUI cg = new CreateGUI();
        cg.create();    //previous method (not mentioned here)           
            CreateGUI.TestPanel tp = cg.new TestPanel(); //problem
            JPanel panel = new JPanel();
            f.add(panel);
            f.setSize(800, 600);
            f.setLocationRelativeTo(null);
        f.getContentPane().setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });
}

Я ожидаю, что будет градиент, но его нет;фон JPanel по-прежнему белый

1 Ответ

0 голосов
/ 11 ноября 2019
  1. Экземпляр TestPanel никогда ни к чему не добавляется
  2. null макеты не позволят компоненту выбрать размер и расположение, поэтому вы ничего не увидите, даже если ваш предыдущий сделалstep
  3. Если вы не добавляете в него дочерние компоненты, вы должны указать подсказку о размерах, чтобы у менеджеров по макету было с чем работать.

Например:

Example

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    class TestPanel extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            int w = getWidth();
            int h = getHeight();
            Color color1 = Color.BLUE;
            Color color2 = Color.GREEN;
            GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
            g2d.setPaint(gp);
            g2d.fillRect(0, 0, w, h);
            g2d.dispose();
        }
    }
}
...