在学习java图形界面的时候,就想编写一个属于自己的窗体,可以自己定义组件的形状颜色等,今天终于实现了,和大家分享一下
首先编写自定义panel
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; public class MyPane extends JPanel { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(new Color(255,255,255,140)); g2d.fillRoundRect(3, 3, getWidth()-7, getHeight()-7, 20, 20); g2d.setClip(0, 0, getWidth(), 30); g2d.setColor(Color.WHITE); g2d.fillRoundRect(1, 3, getWidth()-2, getHeight()-1, 20, 20); g2d.setClip(null); g2d.setColor(Color.darkGray); g2d.setStroke(new BasicStroke(6)); g2d.drawRoundRect(3, 3, getWidth()-7, getHeight()-7, 20, 20); g2d.setFont(new Font("Arial", Font.BOLD, 16)); g2d.setColor(Color.DARK_GRAY); g2d.drawString("Swing UI Test", 15, 24); } }
自定义按钮UI
package jcomponent_v3; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.basic.BasicButtonUI; public class MyButton extends BasicButtonUI { @Override protected void installDefaults(AbstractButton b) { // TODO Auto-generated method stub super.installDefaults(b); LookAndFeel.installProperty(b, "opaque", Boolean.FALSE); } @Override public void paint(Graphics g, JComponent c) { g.setColor(new Color(255,0,0,150)); g.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), 50, 50); super.paint(g, c); } @Override protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { // TODO Auto-generated method stub super.paintText(g, b, textRect, text); } @Override protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) { // TODO Auto-generated method stub super.paintFocus(g, b, viewRect, textRect, iconRect); } @Override protected void paintButtonPressed(Graphics g, AbstractButton b) { g.setColor(new Color(255,200,0,150)); g.fillRoundRect(0, 0, b.getWidth(), b.getHeight(), 50, 50); } @Override protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) { // TODO Auto-generated method stub super.paintIcon(g, c, iconRect); } @Override protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) { super.paintText(g, c, textRect, text); } }
自定义窗体
import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.Point; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.LayoutStyle.ComponentPlacement; public class MyFrame extends JFrame { private MyPane contentPane; int mx,my,jfx,jfy; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MyFrame frame = new MyFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyFrame() { setTitle("TestSwingAPI"); addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { if (e.getKeyCode() == 0) { System.exit(0); } } }); setUndecorated(true); setBackground(new Color(0,0,0,0)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new MyPane(); contentPane.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my)); } }); contentPane.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { mx = e.getXOnScreen(); my = e.getYOnScreen(); jfx = getX(); jfy = getY(); } }); contentPane.setOpaque(false); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setOpaque(false); panel.setBounds(6, 31, 438, 263); contentPane.add(panel); JButton btnExit = new JButton("EXIT"); btnExit.setUI(new MyButtonUI()); JButton btnMax = new JButton("MAX"); btnMax.setUI(new MyButtonUI()); btnMax.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (getExtendedState() == JFrame.MAXIMIZED_BOTH) { setExtendedState(JFrame.NORMAL); }else { setExtendedState(JFrame.MAXIMIZED_BOTH); } } }); JButton btnMin = new JButton("MIN"); btnMin.setUI(new MyButtonUI()); btnMin.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { setExtendedState(JFrame.ICONIFIED); } }); GroupLayout gl_panel = new GroupLayout(panel); gl_panel.setHorizontalGroup( gl_panel.createParallelGroup(Alignment.TRAILING) .addGroup(gl_panel.createSequentialGroup() .addContainerGap(195, Short.MAX_VALUE) .addComponent(btnMin) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(btnMax) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(btnExit) .addContainerGap()) ); gl_panel.setVerticalGroup( gl_panel.createParallelGroup(Alignment.TRAILING) .addGroup(Alignment.LEADING, gl_panel.createSequentialGroup() .addContainerGap() .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(btnExit) .addComponent(btnMax) .addComponent(btnMin)) .addContainerGap(228, Short.MAX_VALUE)) ); panel.setLayout(gl_panel); btnExit.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.exit(0); } }); } }
效果如图:
相关推荐
5. 将自定义窗体集成到项目中,与其他组件和功能进行交互。 通过这种方式,开发者可以创建出独特且具有吸引力的用户界面,提高应用的用户体验。在Delphi中,这种自定义窗体的灵活性和强大功能使得开发者能够实现...
下面我们将深入探讨自定义窗体设计器与DockPanel控件的使用及其相关知识点。 首先,自定义窗体设计器是指开发者为了满足特定需求,对系统默认的Visual Studio窗体设计器进行扩展或修改,以提供更高级的功能或更便捷...
在Microsoft Foundation Classes (MFC)库中,自定义窗体是一种常见的需求,它允许开发者创建具有特定功能和外观的窗口,以满足特定的用户界面需求。MFC是Microsoft为Windows平台提供的一种C++类库,它封装了Windows ...
在Delphi编程环境中,自定义窗体描边是一项常见的需求,它可以让你的程序窗口看起来更加独特和专业。本文将深入探讨如何在Delphi中实现自定义窗体描边的演示。 首先,我们要理解窗体(Form)是Delphi应用程序的基本...
自定义窗体设计器允许开发者扩展Visual Studio的设计时环境,创建具有特殊布局、行为或功能的自定义控件和窗体。 在C#中,自定义窗体设计器涉及到以下几个关键知识点: 1. **自定义控件(Custom Control)**:当...
自定义异形窗体,顾名思义,就是窗体的形状不再局限于传统的矩形,而是可以根据需求定制成各种形状,如心形、圆形、动物形状等,以增加应用的视觉吸引力和用户体验。在Winform中实现这一功能,通常需要利用GDI+图形...
2. **UserControl**:在WPF中,UserControl是一个可以自定义的UI组件,可以封装一组相关的控件和逻辑。创建自定义通知窗体通常会基于UserControl来实现,因为它允许我们构建自己的视图模型并复用。 3. **数据绑定**...
自定义控件是指开发者根据特定需求,通过继承标准控件或从头编写控件类来实现的具有特定功能或外观的组件。在VB中,我们可以通过以下步骤创建自定义控件: 1. **创建新类**: 首先,我们需要创建一个新的类,该类...
在Delphi编程环境中,窗体(Forms)和组件(Components)是构建用户界面(UI)的基础元素。Delphi提供了一种可视化设计工具,允许开发者通过拖放组件到窗体上来创建应用程序。本教程将深入探讨Delphi窗体与组件的...
在描述中提到的“可以任意自定义窗体”,意味着你可以自由地设计窗体的布局,不仅限于预置的控件。你可以自定义控件的外观,例如改变字体、颜色、边框样式等;也可以调整控件的行为,如响应鼠标点击、键盘输入等事件...
在Windows Forms开发中,自定义组件需要处理窗体的大小变化,确保控件能够正确地自动布局和调整大小。 5. **Ex02_29**: 可能展示了控件的生命周期管理,包括初始化、加载、卸载等阶段。理解控件的生命周期对于编写...
"手动改变自制窗体的大小"这个主题聚焦于如何通过代码控制自定义窗体的尺寸。在C#中,窗体(Form)是应用程序的主要视觉组件,用户可以通过它与应用程序进行交互。以下将详细讲解如何实现这个功能。 首先,我们需要...
- **CLR(Common Language Runtime)**:是.NET框架的核心组件之一,提供了执行环境,使得开发人员能够用多种编程语言编写代码,并且这些代码可以在同一平台上无缝交互。CLR负责管理内存、线程和对象生命周期等任务...
描述中的“针对打印的窗口缩放写了一点代码”表明开发者可能已经尝试通过编写自定义代码来调整FastReport预览窗口的缩放比例,以便更好地适应不同用户的视图需求。然而,“还有些问题”意味着当前的实现可能并不完美...
综上所述,这个圆形窗体程序通过C#编程实现了Windows Forms窗体的自定义绘制,利用`Graphics`和`GraphicsPath`类创建出圆形的视觉效果,同时也可能涉及到了性能优化和用户交互的处理。通过深入理解这些概念,开发者...
4. **编写代码**:在窗体的`Load`事件或其他适当的地方,调用`FromPrint`组件的打印方法,如`Print()`。你还可以根据需要处理`FromPrint`组件的事件,如`PrintPage`事件,以实现更复杂的打印逻辑。 5. **测试打印**...
通过以上步骤,开发者可以创建出一个具有抖动效果的自定义窗体控件。这种控件在游戏、模拟或其他需要吸引用户注意力的场景中特别有用。记住,源代码的学习和理解是提升编程技能的关键,所以仔细研究提供的源代码,...
通过自定义窗体的外观和行为,可以提升用户体验,使程序看起来更专业、更具吸引力。 "vbNeoCaption.vbp"和"vbNeoCaption.vbw"是两个重要的文件。".vbp"是VB项目文件,它包含了关于工程的所有基本信息,如窗体、模块...
在这个自定义日期时间设置窗体中,滑块组件被巧妙地用来实现时间选择。在QT中,QSlider类可以用于创建水平或垂直滑动条,通过滑动条的值改变事件,可以关联到特定的时间选择函数,从而更新显示的日期和时间。这通常...