Java GUI界面补充总结(不定期补充)
程序员文章站
2022-03-04 20:01:22
...
一、Java中如何设置各类组件透明
感谢原文:https://kslsi.iteye.com/blog/2096608
对于一般的swing组件,设置透明就只用一句代码:
nameOfComponent.setOpaque(false);
但这一句代码不是万能的 ,当遇到JButton、JScrollPane、JTable等等组件的时候,这一句代码是完全不够用的,下面来总结一下吧~
JButton,按钮组件,用下面这句代码将其设置为透明:
jbt_login.setContentAreaFilled(false);
对比效果如图:
同时我们也可用自己定义的图片替换按钮(实际上将图片添加到按钮上),使我们的界面看起来更漂亮,通过以下代码实现:
jbt_login = new JButton("登 录");//实例化一个JButton对象
ImageIcon icon = new ImageIcon("images/loginBackground.jpg");//实例化一个图片对象
jbt_login.setIcon(icon);
jbt_login.setContentAreaFilled(false);
JScrollPane视图,相对于JButton复杂一点,不过也就只多了一行代码:
name.setOpaque(false);
name.getViewport().setOpaque(false);
不过值得注意的是,这两行代码只是让JScrollPane视图透明,在应用中添加在此视图上的其他组件也要都要setOpaque(false)。
JTable,队友说:我再也不想理JTable了,它太逗了。然后我笑了,不过现在发现JTable确实很逗,设置透明最为复杂。
JTable实例化的一个表分为表头和表体(我姑且这么叫),所以在设置透明的时候,也得分为两部分实现:
表体:
/* *
* 将表格设置为透明,表格同样包括表格本身和其中的内容项
* 仅仅将表格本身设置为透明也没有用,应该将其中的内容项也设置为透明
* 内容项的设置是通过设置渲染器的透明来实现
*/
table.setOpaque(false);
DefaultTableCellRenderer render = new DefaultTableCellRenderer();
render.setOpaque(false);//将渲染器设置为透明
//将这个渲染器设置到fileTable里。
//这个设置在没有另外专门对column设置的情况下有效
//若你对某个column特殊指定了渲染器,则对于这个column,它将不调用render渲染器
//因此为了保证透明,如果你对column额外指定了渲染器,那么在额外的渲染器里也应该设置透明
table.setDefaultRenderer(Object.class, render);
注:在设置一个表透明的时候,一定的再设置之前有这个表,否则你动作的对象都没有,如何做这个动作呢?
表头:
//头部实际上也是一个JTABLE,只有一行而已。
JTableHeader header = fileTable.getTableHeader();//获取头部
header.setOpaque(false);//设置头部为透明
header.getTable().setOpaque(false);//设置头部里面的表格透明
/* *
* 头部的表格也像前面的表格设置一样,还需要将里面的单元项设置为透明
* 因此同样需要对头部单元项进行透明度设置,这里还是用渲染器。
*/
header.setDefaultRenderer(render);
TableCellRenderer headerRenderer = header.getDefaultRenderer();
if (headerRenderer instanceof JComponent)
{
((JComponent) headerRenderer).setOpaque(false);
}
注:表头设置透明以后,表头部分的网格线会丢失,如果想将其补全的话可以用自己画。方法此处不提供。
下图为设置各个组件透明后的效果(由于效果,未设置表头透明):
java 去按钮边框及焦点
感谢原文:https://blog.csdn.net/qq_37614259/article/details/72854547
JButton jb;
//去焦点
jb.setFocusPainted(false);
//去边框
jb.setBorderPainted(false);
效果图
按钮内部类,重绘按钮
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.*;
public class Test1 extends JFrame{
int x,y,xx,yy;
boolean isDraging;
public static void main(String[] args) {
new Test1();
}
Test1(){
MyButton jb = new MyButton();
this.add(jb);
this.setSize(400, 400);
//this.setLocationRelativeTo(null);
int windowWidth = this.getWidth(); //获得窗口宽
int windowHeight = this.getHeight(); //获得窗口高
Toolkit kit = Toolkit.getDefaultToolkit(); //定义工具包
Dimension screenSize = kit.getScreenSize(); //获取屏幕的尺寸
int screenWidth = screenSize.width; //获取屏幕的宽
int screenHeight = screenSize.height; //获取屏幕的高
this.setLocation(screenWidth/2-windowWidth/2, screenHeight/2-windowHeight/2);//设置窗口居中显示
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//窗口拖动
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
isDraging = true;
xx = e.getX();
yy = e.getY();
}
public void mouseReleased(MouseEvent e) {
isDraging = false;
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
if (isDraging) {
int left = getLocation().x;
int top = getLocation().y;
setLocation(left + e.getX() - xx, top + e.getY() - yy);
}
}
});
}
}
class MyButton extends JButton {
private static final long serialVersionUID = 1965063150601339314L;
public MyButton() {
super();
setOpaque(false);
setContentAreaFilled(false); // 这一句非常重要, 否则父类还会绘制按钮的区域.
}
@Override
protected void paintComponent(Graphics g) {
int width = this.getWidth();
int height = this.getHeight();
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 设置画笔颜色
g2d.setColor(Color.GREEN);
// 画矩形
// g.draw3DRect(10, 10, 50, 50, false);
// g2d.fillRoundRect(0, 0, width, height, 20, 20);
// 画图片
g.drawImage(new ImageIcon("Test_Img/background.jpg").getImage(), 0, 0, 100,30,this);//this代指JPanel本身,意思是把图片放这上面
super.paintComponent(g); // 最后调用这个方法, 让父类绘制在按钮上绘制文字.
}
}