Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JTable即使添加到JScrollPane中也不显示JTable标题?_Java_Swing_Jtable_Transparency_Paintcomponent - Fatal编程技术网

Java 为什么JTable即使添加到JScrollPane中也不显示JTable标题?

Java 为什么JTable即使添加到JScrollPane中也不显示JTable标题?,java,swing,jtable,transparency,paintcomponent,Java,Swing,Jtable,Transparency,Paintcomponent,为什么JTable即使添加到JScrollPane中也不显示JTable标题? 控制台也会先显示一条错误消息,然后迅速离开并启动程序?是的,我想知道这有什么问题,你也可以告诉我这个程序中的一些坏习惯,比如它的打字方式。问题 null布局。避免使用null布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题。有关更多详细信息,请参阅 过度使用

为什么JTable即使添加到JScrollPane中也不显示JTable标题? 控制台也会先显示一条错误消息,然后迅速离开并启动程序?是的,我想知道这有什么问题,你也可以告诉我这个程序中的一些坏习惯,比如它的打字方式。

问题
  • null
    布局。避免使用
    null
    布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题。有关更多详细信息,请参阅
  • 过度使用
    静态
    static
    不是你的朋友,你应该避免使用它。这不是一个跨对象的通信机制,像这样的过度使用会让你焦头烂额
  • 实际上,您没有将
    JTable
    包装在
    JScrollPane
  • 通过不调用
    super.paintComponent
    来打破
    paint
    链,这将产生一系列精彩的绘画作品。有关如何在Swing中进行绘制的更多详细信息,请参见和
  • 您可能希望有一个通读版本,这将使人们更容易阅读您的代码,您也更容易阅读其他代码
  • UI的所有交互、创建和修改都应该在事件调度事件的上下文中完成,以降低潜在竞争条件、死锁和渲染工件的风险。有关更多详细信息,请参阅
  • Toolkit.getDefaultToolkit().getScreenSize()
    对于屏幕的可视空间来说是一个不好的指示器,它没有考虑操作系统特定的元素,比如dock或任务栏,它们可能会让你的应用程序出现在它们下面(我真的,真的,真的很讨厌这种情况)。使用适当的布局管理器和
    pack
    打包内容周围的窗口。然后,您可以使用
    JFrame#setLocationRelativeTo
    并将其传递给
    null
    ,它将使框架在屏幕中居中
JScrollPane
问题。。。 简单的解决方案是使用
JScrollPane
的构造函数将
JTable
的引用传递给它

import javax.swing.*; 
import javax.swing.border.*;
import javax.swing.table.TableColumn;

import java.awt.*;

import static java.awt.GraphicsDevice.WindowTranslucency.*;

import java.awt.Checkbox;
import java.awt.Paint;
import java.awt.Toolkit;
import java.awt.event.*;

public class Main extends JPanel {

    static Object [][] Services = {{"Google.exe","Chickeaen.exe","Crp.exe"}};
    static String [] ColNames = {"Processes:","Crolly:","Haler:"};

    static JFrame Fram = new JFrame(); 
    static JTextField CBox = new JTextField();
    static JTable Tabs = new JTable(Services,ColNames);
    JScrollPane ScrollArea = new JScrollPane();
    static JButton ExitB = new JButton();
    Dimension ScreenSize = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
    Border BlackLineB = BorderFactory.createLineBorder(new Color(50,50,50));

    public Main() {

    Fram.setTitle("Jared Console");
    Fram.setUndecorated(true);
    Fram.setVisible(true); 
    Fram.setDefaultCloseOperation(Fram.EXIT_ON_CLOSE);
    Fram.setResizable(false);
    Fram.setSize((int)Math.round(ScreenSize.getWidth()*0.45),(int)Math.round(ScreenSize.getHeight()*0.33));
    Fram.setBackground(new Color(0,0,0,150));
    Fram.add(this);

    CBox.setSize((int)Math.round(Fram.getWidth()*0.80),(int)Math.round(Fram.getHeight()*0.25));
    CBox.setBackground(new Color(255,255,255));
    CBox.setBorder(BorderFactory.createCompoundBorder(BlackLineB,BorderFactory.createEmptyBorder(0,20,0,0)));
    CBox.setLocation((int)Math.round(Fram.getWidth()*0.1),(int)Math.round(Fram.getHeight()*0.70));
    CBox.setFont(new Font("Arial",Font.BOLD,20));
    CBox.setVisible(true);

    ScrollArea.setSize((int)Math.round(Fram.getWidth()*0.80),(int)Math.round(Fram.getHeight()*0.50)); 
    ScrollArea.setLocation((int)Math.round(Fram.getWidth()*0.10),(int)Math.round(Fram.getHeight()*0.10));
    ScrollArea.setBorder(BlackLineB);
    ScrollArea.setLayout(null);
    ScrollArea.setVisible(true);

    Tabs.setSize((int)Math.round(Fram.getWidth()*0.995),(int)Math.round(Fram.getHeight()*0.995));
    Tabs.setLocation((int)Math.round(Fram.getWidth()*0.003),(int)Math.round(Fram.getHeight()*0.005));
    Tabs.setFillsViewportHeight(true);
    Tabs.setBackground(new Color(255,255,255));

    this.add(CBox);
    this.add(Tabs);
    this.add(ExitB);
    ScrollArea.add(Tabs);
    this.add(ScrollArea);
    this.setBorder(BorderFactory.createLineBorder(new Color(50,50,50),5));
    this.setLayout(null);
    this.setBackground(new Color(0,0,0));
    this.setVisible(true);

    }

    public void paintComponent(Graphics Gla) { 
    Paint Plat = new GradientPaint(0f, 0f, new Color(0, 40, 0, 0), 0.0f, Fram.getHeight(), new Color(0, 0, 0, 150), true); //Made 200 equal to Fram Background Alpha.
    Graphics2D Quo = (Graphics2D)Gla;
    Quo.setPaint(Plat);
    Quo.fillRect(0, 0, Fram.getWidth(), Fram.getHeight());
    }

    public static void main(String[] args) {
    Main CScreen = new Main(); 
    GraphicsEnvironment GE = GraphicsEnvironment.getLocalGraphicsEnvironment(); // Have to study lines 57,58 and 59
    GraphicsDevice GD = GE.getDefaultScreenDevice();
    boolean CheckTransL = GD.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);

    if (!CheckTransL) {
        System.out.println("PERPIXEL TRANSLUCENT NOT SUPPORTED - LOL UPDATESCRUB!");
        System.exit(0);
    };  
    }

}
但是,之后在代码中执行此操作

static JTable Tabs = new JTable(Services,ColNames);
JScrollPane ScrollArea = new JScrollPane(Tabs);
这将从滚动窗格中删除该表以将其添加到您的面板中,因为组件只能有一个父级

另一个选项是指定滚动窗格的视口的视图组件

this.add(Tabs);
您不应该将组件直接添加到滚动窗格(或其基础视口),它们有自己的内部布局管理功能。相反,您需要将组件作为“视图”提供给
JViewport


查看更多详细信息。

首先,您应该将
JTable
添加到
JScrollPane
视口中,以便可以看到
JTableHeader

在这之后,您应该not
JTable
添加到
JScrollPane
和底层容器中。你应该:

  • JTable
    添加到
    JScrollPane
    视口中
  • JScrollPane
    添加到基础容器中
  • 并删除将
    JTable
    显式添加到容器的行


    祝您好运。

    因为您没有,所以请将表包装在
    JScrollPane
    ScrollArea.setLayout(null)中我的,我的。。如果这不是问题的一部分,我就把帽子吃掉。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。请使用布局管理器,或者与.BTW一起使用布局填充和边框-请学习常见的Java命名法(命名约定-例如,
    EachWordUpperCaseClass
    firstWordLowerCaseMethod()
    firstWordLowerCaseAttribute
    ,除非它是一个
    大写常量
    )并且
    public void paintComponent(Graphics Gla){Paint Plat..
    应该是
    public void paintComponent(Graphics Gla){super.paintComponent(Gla);Paint Plat..
    以避免绘制瑕疵并确保绘制边框等。“不支持每像素半透明-LOL UPDATESCRUB!”-每像素alphering支持也是一个操作系统问题,用户可能有硬件,但操作系统可能不受支持;)@mKorbel我想过一会儿,我就不再看了:P
    this.add(CBox);
    //this.add(Tabs);
    this.add(ExitB);
    //ScrollArea.add(Tabs);
    ScrollArea.setViewportView(Tabs);
    this.add(ScrollArea);