java组件awt,java – 将JSplitPane与AWT组件一起使用

我有一个AWT画布,我无法转换为Swing组件(它来自VTK).我希望在JSplitPane中显示一些这样的画布.我已经读过在Java中混合重量和重量轻的组件,并且知道这是一个痛苦的屁股,但我没有选择.如果我将AWT画布包装在JPanel中,然后将其放在拆分窗格上,则拆分窗格根本不起作用.但是,如果我将AWT画布放在JPanel中,然后放在JScrollPane内部,然后放在JSplitPane上的那些滚动窗格,则拆分窗格会起作用,但AWT画布组件不会正确调整大小.我失去了关于如何在移动JSplitPane的分隔符时使AWT画布组件正确调整大小.我可以捕捉分频器移动操作并在那时操作AWT画布,但我不知道该怎么做.我已经尝试调用invalidate()然后validate()然后重绘(),但这不起作用.

有任何想法吗?

这是问题的一个例子

import javax.swing.*;

import java.awt.*;

public class SwingAWTError {

public static void main(String[] args) {

Canvas leftCanvas = new Canvas();

Canvas rightCanvas = new Canvas();

leftCanvas.setBackground(Color.RED);

rightCanvas.setBackground(Color.BLUE);

JPanel leftPanel = new JPanel();

JPanel rightPanel = new JPanel();

leftPanel.setLayout(new BorderLayout());

rightPanel.setLayout(new BorderLayout());

leftPanel.add(leftCanvas, BorderLayout.CENTER);

rightPanel.add(rightCanvas, BorderLayout.CENTER);

JScrollPane leftScroll = new JScrollPane();

JScrollPane rightScroll = new JScrollPane();

leftScroll.getViewport().add(leftPanel);

rightScroll.getViewport().add(rightPanel);

JSplitPane split = new JSplitPane();

split.setLeftComponent(leftScroll);

split.setRightComponent(rightScroll);

split.setDividerLocation(400);

JFrame frame = new JFrame();

frame.getContentPane().setLayout(new BorderLayout());

frame.getContentPane().add(split, BorderLayout.CENTER);

frame.setSize(800, 800);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Swing组件库中的JList和JButton组合实现穿梭框(也称为双向列表框)的功能。 具体步骤如下: 1. 创建两个JList组件,分别用于显示左侧和右侧的列表数据。 2. 创建两个JButton组件,分别表示将左侧的数据移动到右侧和将右侧的数据移动到左侧。 3. 将左侧和右侧的JList组件添加到JSplitPane中,使其可以拖动分割条来调整两个列表的大小。 4. 将两个JButton组件添加到一个JPanel中,并添加到JSplitPane的中央位置。 5. 给两个JButton组件添加ActionListener,当用户点击按钮时,将所选的数据从一个JList组件中移除,并添加到另一个JList组件中。 6. 最后将JSplitPane添加到主窗口中。 下面是一个简单的实现代码示例: ``` import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ShuttleBoxDemo extends JFrame implements ActionListener { private JList<String> leftList; private JList<String> rightList; private JButton toRightButton; private JButton toLeftButton; public ShuttleBoxDemo() { setTitle("ShuttleBox Demo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); // 创建左侧列表 String[] leftData = {"Java", "Python", "C++", "Ruby", "JavaScript"}; leftList = new JList<>(leftData); // 创建右侧列表 String[] rightData = {}; rightList = new JList<>(rightData); // 创建按钮面板 JPanel buttonPanel = new JPanel(new GridLayout(2, 1)); toRightButton = new JButton(">"); toRightButton.addActionListener(this); toLeftButton = new JButton("<"); toLeftButton.addActionListener(this); buttonPanel.add(toRightButton); buttonPanel.add(toLeftButton); // 创建分割面板 JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(leftList), new JScrollPane(rightList)); splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(150); splitPane.setDividerSize(5); splitPane.setContinuousLayout(true); splitPane.setResizeWeight(0.5); // 将按钮面板添加到分割面板中央位置 splitPane.setDividerLocation(getWidth() / 2); splitPane.setRightComponent(buttonPanel); // 将分割面板添加到主窗口中 getContentPane().add(splitPane); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == toRightButton) { // 将左侧选中的数据移动到右侧 String[] selectedValues = leftList.getSelectedValuesList().toArray(new String[0]); DefaultListModel<String> leftModel = (DefaultListModel<String>) leftList.getModel(); DefaultListModel<String> rightModel = (DefaultListModel<String>) rightList.getModel(); for (String value : selectedValues) { leftModel.removeElement(value); rightModel.addElement(value); } } else if (source == toLeftButton) { // 将右侧选中的数据移动到左侧 String[] selectedValues = rightList.getSelectedValuesList().toArray(new String[0]); DefaultListModel<String> leftModel = (DefaultListModel<String>) leftList.getModel(); DefaultListModel<String> rightModel = (DefaultListModel<String>) rightList.getModel(); for (String value : selectedValues) { rightModel.removeElement(value); leftModel.addElement(value); } } } public static void main(String[] args) { new ShuttleBoxDemo(); } } ``` 在这个示例中,我们创建了一个包含左右两个列表和两个按钮的穿梭框,用户可以通过点击按钮来将数据在两个列表之间移动。其中左侧列表的数据是固定的,右侧列表的数据为空,用户可以通过移动数据来进行选择。这个实现是比较简单的,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值