JFrame着色应该喜欢这张照片

我的问题有点奇怪。

我希望我创建的表单(使用JFrame)着色应该像这样的图片:

在此处输入图像描述

我应该使用特殊的外观吗?

我应该使用特殊的外观吗?

没有像我所知的那样内置的外观和感觉。 然而,对于“外观和感觉”, “外观”指的是GUI小部件(更正式地说,JComponents)的外观, “感觉”指的是小部件的行为方式。 如果是这样,那么我们总是可以让我们的Swing组件在GUI中出现。

先进的响应式应用程序,图形丰富渗透酷,从一开始就吸引用户,并以令人兴奋的死亡抓住他们。 他们让用户告诉他们的朋友应用程序。

但是,要开发图形丰富的Swing应用程序,我们必须知道如何在组件上渲染自定义图形,使它们按照我们想要的方式显示(具有shiny的颜色,漂亮的纹理,移动的动画,漂亮的排版)。 我们需要学习如何正确布局组件以将它们相对于另一个进行排列。 从回答你的各种问题,我开始明白你想成为一个摇摆的怪人。 好:

  • 首先 ,了解Swing JComponent ( JPanel, JLabel, JButton, JList, JTable, JTextPane等)和各种类型的事件侦听器以及它们如何响应组件。
  • 其次 ,了解Layout Managers 。 还有其他高级布局管理器可以使生活更轻松,但首先要了解标准管理器。
  • 第三 ,了解在摆动组件和摆动喷涂机制上渲染自定义图形 。 然后关于字体概念 。
  • ,了解GraphicsGraphics2D类,用于渲染龋齿类型的几何对象,图像渲染,纹理,渐变绘画等。
  • ,了解Swing中的并发性 。 Swing不是线程安全的,它维护单线程规则。 需要很好的线程知识,StackOverflow几乎每天都会出现Swing的线程问题。
  • ,收集书籍肮脏的富客户端,并在你几乎完成上述所有工作后彻底阅读。

现在,为您演示示例:

我试图让应用程序尽可能简短。 但是我已经做了一些事情来实现你所要求的GUI,你不应该这样做,如果你不知道它们是如何工作的( 例如覆盖paint()函数 )。 在此示例中,我无法像您提供的图像一样收集纹理。 但我使用了织物纹理 。 应用程序需要首先加载纹理图像。 密切关注控制台。 它将在运行应用程序之前显示以下消息:

请等一下,加载纹理: http : //www.brewsterwallcovering.com/data/default/images/catalog/original/289-5757.jpg

加载完成。 开始演示!

我使用过: GridBagLayout作为MainContainer的窗格布局管理器。 仔细看看代码并阅读相应的扩展(扩展JCompononent和JButton)以及我为实现更好的GUI而做的绘画(对许多评论家而言,这不是那么好,但对于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 ,它可以让您获得一些非常棒的外观和感觉。 我认为如果你在Java Swing中寻找一个可以提供更好的外观和动画效果的优秀设计,那么最好使用JavaFX。 你可以参考这个链接,希望这对你有所帮助。

开始使用FXML

使用JavaFX进行Swing