java - 在半透明 Swing 窗口内创建 jtable

标签 java swing jtable

我需要用java创建一个半透明的swing窗口,其中有一个表格和一个按钮。表格内容是从xml文件导入的。我的代码是这样的

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import static java.awt.GraphicsDevice.WindowTranslucency.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Swings extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public File xml = null;
    public Document dom = null;
    public JScrollPane jScrollPane1;
    public DefaultTableModel model;
    public JTable jTable1;
    public JButton update_button;

    public Swings() {
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        setSize(new Dimension(600, 500));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // statusLabel.setSize(350,100);
        JPanel panel = new JPanel() {
            private static final long serialVersionUID = 1L;

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (g instanceof Graphics2D) {
                    final int R = 220;
                    final int G = 220;
                    final int B = 250;
                    Paint p = new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0), 0.0f, getHeight(), new Color(R, G, B, 255), true);
                    Graphics2D g2d = (Graphics2D) g;
                    g2d.setPaint(p);
                    g2d.fillRect(0, 0, getWidth(), getHeight());
                    Font font = new Font("Serif", Font.PLAIN, 45);
                    g2d.setFont(font);
                    g2d.Color(Color.red);
                    g2d.drawString("Service Now Notification", 40, 120);
                }
            }
        };
        xml = new File(System.getProperty("user.dir") + File.separator + "Html1.xml");
        installGUI();
        setContentPane(panel);
        setLayout(new GridBagLayout());
        add(jtable1);
        add(update_button);
    }

    public void installGUI() {
        Container ctr = getContentPane();
        ctr.setLayout(new BorderLayout());
        model = new DefaultTableModel() {
            private static final long serialVersionUID = 1L;

            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        // creates an instance of the table class and sets it up in a scrollpane
        jTable1 = new JTable(model);
        jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1 = new JScrollPane(jTable1);
        ctr.add(BorderLayout.CENTER, jScrollPane1);
        // add some columns
        model.addColumn("Number");
        model.addColumn("Priority");
        model.addColumn("State");
        model.addColumn("Assigned");
        model.addColumn("Short_desc");
        model.addColumn("Task");
        if (xml.exists() && xml.length() != 0) {
            dom = parseFile(xml);
            insertTableRows(model, dom);
        }
    }

    // creates an instance of a Document object
    public Document parseFile(File file) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            dom = (Document) builder.parse(file);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return dom;
    }

    public void insertTableRows(DefaultTableModel tableModel, Document doc) {
        Element root = doc.getDocumentElement();
        NodeList list = root.getElementsByTagName("MS");
        for (int i = 0; i < list.getLength(); ++i) {
            Element e = (Element) list.item(i);
            if (e.getNodeType() == Element.ELEMENT_NODE) {
                Object[] row = { getArticleInfo("S", e) };
                tableModel.addRow(row);
            }
        }
        tableModel.fireTableStructureChanged();
        tableModel.fireTableDataChanged();
    }

    public Object getArticleInfo(String tagName, Element elem) {
        NodeList list = elem.getElementsByTagName(tagName);
        for (int i = 0; i < list.getLength(); ++i) {
            Node node = (Node) list.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Node child = (Node) node.getFirstChild();
                return child.getTextContent().trim();
            }
            return null;
        }
        return null;
    }

    public static void main(String[] args) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        boolean isPerPixelTranslucencySupported = gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
        if (!isPerPixelTranslucencySupported) {
            System.out.println("Per-pixel translucency is not supported");
            System.exit(0);
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Swing gtw = new Swing();
                // gtw.runn();
                gtw.setVisible(true);
            }
        });
    }
}

xml文件内容是这样的:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
    <Obj RefId="0">
        <TN RefId="0">
            <T>Selected.System.Management.Automation.PSCustomObject</T> 
            <T>System.Management.Automation.PSCustomObject</T> 
            <T>System.Object</T> 
        </TN>
        <MS>
            <S N="Number">INC0811168</S> 
            <S N="Priority">2 - High</S> 
            <S N="State">Assigned</S> 
            <S N="Assigned">New</S> 
            <S N="Short_desc">Review Ad-Hoc Service Request for Lavon A Gudmundson</S> 
            <S N="Task">Catalog Task</S> 
        </MS>
    </Obj>
</Objs>

我收到一个半透明的通知窗口,其中有一个按钮作为输出。

最佳答案

暂时忽略透明窗口(看来您已经弄清楚了),基本上有两种方法可以实现您想要实现的目标,具体取决于您想要实现的目标,但是,基本方法读取 XML 文件保持不变...

您可以将 XML 数据预加载到匹配的 POJO 中,并将它们添加到某种管理结构中(例如 List),并将这些值应用到 TableModel 或将 TableModel 模型包装在 XML 文档本身周围,并让它管理整个过程...

这个示例执行了后者,但将加载过程分开并执行前者并不需要太多...

XMLTable

import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLTableExample {

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

    public XMLTableExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JTable table = new JTable();
                try {
                    table.setModel(new XMLTableModel(new File("Html1.xml")));
                } catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class XMLTableModel extends AbstractTableModel {

        protected static final String[] COLUMN_NAMES = {
            "Number",
            "Priority",
            "State",
            "Assigned",
            "Description",
            "Task"
        };
        private List<MSEntity> rows;

        public XMLTableModel(File file) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
            rows = new ArrayList<>(25);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document dom = db.parse(file);

            setDocument(dom);
        }

        protected String getMSValue(Node msNode, String name) throws XPathExpressionException {
            XPath xpath = XPathFactory.newInstance().newXPath();
            XPathExpression expression = xpath.compile("S[@N='" + name + "']");
            Node sNode = (Node)expression.evaluate(msNode, XPathConstants.NODE);
            return sNode != null ? sNode.getTextContent() : null;
        }

        @Override
        public int getRowCount() {
            return rows.size();
        }

        @Override
        public int getColumnCount() {
            return COLUMN_NAMES.length;
        }

        @Override
        public String getColumnName(int column) {
            return COLUMN_NAMES[column];
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        public MSEntity getEntityAtRow(int row) {
            return rows.get(row);
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            MSEntity entity = getEntityAtRow(rowIndex);
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = entity.getNumber();
                    break;
                case 1:
                    value = entity.getPriority();
                    break;
                case 2:
                    value = entity.getState();
                    break;
                case 3:
                    value = entity.getAssigned();
                    break;
                case 4:
                    value = entity.getDesc();
                    break;
                case 5:
                    value = entity.getTask();
                    break;
            }
            return value;
        }

        public void setDocument(Document dom) throws XPathExpressionException {

            XPath xpath = XPathFactory.newInstance().newXPath();
            XPathExpression expression = xpath.compile("/Objs/Obj/MS");
            NodeList nl = (NodeList)expression.evaluate(dom, XPathConstants.NODESET);
            for (int index = 0; index < nl.getLength(); index++) {
                Node node = nl.item(index);
                String number = getMSValue(node, "Number");
                String priority = getMSValue(node, "Priority");
                String state = getMSValue(node, "State");
                String assigned = getMSValue(node, "Assigned");
                String desc = getMSValue(node, "Short_desc");
                String task = getMSValue(node, "Task");

                MSEntity entity = new MSEntity(number, priority, state, assigned, desc, task);
                rows.add(entity);
            }

            fireTableDataChanged();

        }

        public class MSEntity {
            private final String number;
            private final String priority;
            private final String state;
            private final String assigned;
            private final String desc;
            private final String task;

            public MSEntity(String number, String priority, String state, String assigned, String desc, String task) {
                this.number = number;
                this.priority = priority;
                this.state = state;
                this.assigned = assigned;
                this.desc = desc;
                this.task = task;
            }

            public String getAssigned() {
                return assigned;
            }

            public String getDesc() {
                return desc;
            }

            public String getNumber() {
                return number;
            }

            public String getPriority() {
                return priority;
            }

            public String getState() {
                return state;
            }

            public String getTask() {
                return task;
            }

        }

    }

}

您可能想了解有关透明方法的一些注意事项...JScrollPane 是不透明的,JViewport 是不透明的,JTable是不透明的。如果您希望看到抛出这些组件,则必须更改这些状态​​

关于java - 在半透明 Swing 窗口内创建 jtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25032052/

相关文章:

java - 在 JTable 单元格下显示弹出式 JFrame?

java - *.jar/META-INF/*.* 中有哪些文件?

java - 使用 ComboBox if 语句时,方程答案不会输出到 JTextField

java - 如何在 addPropertyChangeListener 中打开 JCombobox

java - JPanel 之间的转换?

java - 如何在 JTable 中使用 Jtable 列按钮渲染来渲染图像?

java - 在 JTable 中禁用水平自动滚动

java - 使用硬件设备的 Android 开发人员,测试应用程序无法运行

java - Spring Boot 3 和 Hibernate 6 迁移错误 : The conversion from datetime2 to DATETIMEOFFSET is unsupported

swing - JTable 单元格值更改监听器