- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个子窗口,我想以两种不同的方式接受拖放对象的放置。
其中一个是 JPanel,我想接受文件列表。效果很好。
另一个是我想要接受字符串列表的 JTable。如果我不启用 JPanel 作为放置目标,它就可以正常工作。
当我尝试同时启用两者时,JPanel 放置目标似乎掩盖了 JTable 放置目标,即使 JTable 不是 JPanel 的子窗口并且两个组件位于不重叠的区域中。
此外,包含它们的 JFrame 似乎也出现了下拉图标...不知道为什么。
有什么建议吗?这很难调试。
<小时/>下面是类似的示例应用程序,在这里我根本无法让 JTable 接受 drop。 :/
还有一个问题我想了解:如果我从“拖动源 1”拖动到“放置目标 1”但不释放鼠标,每次拖动源 1 标签更改时我的光标都会闪烁(每秒一次)在此测试应用程序中)。 为什么要这样做?有没有办法让它不闪烁?
package com.example.test.gui;
import java.awt.Component;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class DragAndDropQuestion {
public enum Color {
RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET, WHITE, BLACK;
@Override public String toString()
{ return this.name().toLowerCase(); }
static public Color randomColor(Random r)
{
Color[] colors = Color.values();
return colors[r.nextInt(colors.length)];
}
}
public static class SampleBean
{
final private Color color;
final private char letter;
final static public DataFlavor dataFlavor =
new DataFlavor(SampleBean.class, "SampleBean");
public Color getColor() { return this.color; }
public char getLetter() { return this.letter; }
private SampleBean(Color color, char letter)
{
this.color = color;
this.letter = letter;
}
static public SampleBean randomBean(Random r)
{
String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return new SampleBean(Color.randomColor(r),
letters.charAt(r.nextInt(letters.length())));
}
@Override public String toString() {
return this.color.toString()+" "+this.letter;
}
}
public static class BorderPanel extends JPanel {
public BorderPanel(String title)
{
setBorder(BorderFactory.createTitledBorder(title));
}
}
public static class BeanTransferable implements Transferable
{
final private SampleBean value;
static final private List<DataFlavor> flavors = Arrays.asList(
DataFlavor.stringFlavor,
SampleBean.dataFlavor
);
public BeanTransferable(SampleBean x) { this.value=x; }
@Override public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (flavors.get(0).equals(flavor))
{
return this.value.toString();
}
else if (flavors.get(1).equals(flavor))
{
return this.value;
}
else
{
throw new UnsupportedFlavorException(flavor);
}
}
@Override public DataFlavor[] getTransferDataFlavors() {
return flavors.toArray(new DataFlavor[0]);
}
@Override public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavors.contains(flavor);
}
}
public abstract static class SimpleDropTarget
implements DropTargetListener
{
final private String debugString;
public SimpleDropTarget(String debugString) {
this.debugString=debugString;
}
@Override public void dragEnter(DropTargetDragEvent event)
{ System.out.println(this.debugString+":dragEnter"); }
@Override public void dragExit(DropTargetEvent event) {}
{ System.out.println(this.debugString+":dragExit"); }
@Override public void dragOver(DropTargetDragEvent event) {}
@Override public void dropActionChanged(DropTargetDragEvent event) {}
public void install(JComponent component) {
new DropTarget(component, this);
}
}
public abstract static class SimpleDragSource
implements DragSourceListener, DragGestureListener
{
final private String debugString;
final private DragSource ds = new DragSource();
public SimpleDragSource(String debugString) {
this.debugString=debugString;
}
@Override public void dragDropEnd(DragSourceDropEvent event) {}
@Override public void dragEnter(DragSourceDragEvent event)
{ System.out.println(this.debugString+":dragEnter"); }
@Override public void dragExit(DragSourceEvent event)
{ System.out.println(this.debugString+":dragExit"); }
@Override public void dragOver(DragSourceDragEvent event) {}
@Override public void dropActionChanged(DragSourceDragEvent event) {}
public void install(JComponent component) {
DragGestureRecognizer dgr =
this.ds.createDefaultDragGestureRecognizer(component,
DnDConstants.ACTION_COPY, this);
}
abstract public Transferable prepareTransferable();
@Override public void dragGestureRecognized(DragGestureEvent dge)
{
this.ds.startDrag(dge,
DragSource.DefaultCopyDrop, prepareTransferable(), this);
}
}
public static class BeanListModel implements TableModel {
final private List<SampleBean> list = new ArrayList<SampleBean>();
enum ColumnType {
COLOR(Color.class, "color") {
@Override public Color extractValue(SampleBean sampleBean) {
return sampleBean.getColor();
}
},
LETTER(String.class, "letter") {
@Override public String extractValue(SampleBean sampleBean) {
return Character.toString(sampleBean.getLetter());
}
},
;
final private Class<?> cl;
final private String name;
public Class<?> getColumnClass() { return this.cl; }
public String getColumnName() { return this.name; }
ColumnType(Class<?> cl, String name)
{ this.cl=cl; this.name=name; }
abstract public Object extractValue(SampleBean sampleBean);
}
final static private ColumnType[] columns
= new ColumnType[]{ColumnType.COLOR, ColumnType.LETTER};
@Override
public void addTableModelListener(TableModelListener arg0) {}
@Override
public void removeTableModelListener(TableModelListener arg0) {}
@Override public Class<?> getColumnClass(int column) {
return columns[column].getColumnClass();
}
@Override public int getColumnCount() {
return columns.length;
}
@Override public String getColumnName(int column) {
return columns[column].getColumnName();
}
@Override public int getRowCount() { return list.size(); }
@Override public Object getValueAt(int row, int column) {
return columns[column].extractValue(list.get(row));
}
@Override public boolean isCellEditable(int row, int column) {
return false;
}
@Override public void setValueAt(Object obj, int row, int column) {
throw new UnsupportedOperationException();
}
public void addBean(SampleBean bean)
{
this.list.add(bean);
}
}
public static class BeanTablePanel extends BorderPanel {
final private JTable table;
final private BeanListModel tableModel;
public BeanTablePanel(String title)
{
super(title);
this.table = new JTable();
this.tableModel = new BeanListModel();
this.table.setModel(this.tableModel);
add(new JScrollPane(this.table));
SimpleDropTarget dt = new SimpleDropTarget("BeanTable"){
@Override public void drop(DropTargetDropEvent dtde) {
Transferable tr = dtde.getTransferable();
if (tr.isDataFlavorSupported(SampleBean.dataFlavor))
{
try {
SampleBean b = (SampleBean)
tr.getTransferData(SampleBean.dataFlavor);
addBean(b);
}
catch (UnsupportedFlavorException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
};
dt.install(this.table);
// !!! This doesn't seem to work...
}
void addBean(SampleBean b) {
this.tableModel.addBean(b);
}
}
public static class BeanLabelPanel extends BorderPanel {
final private JLabel label;
public BeanLabelPanel(String title)
{
super(title);
this.label = new JLabel("drop item here");
add(this.label);
SimpleDropTarget dt = new SimpleDropTarget("BeanLabel"){
@Override public void drop(DropTargetDropEvent dtde) {
Transferable tr = dtde.getTransferable();
if (tr.isDataFlavorSupported(DataFlavor.stringFlavor))
{
try {
String s = (String)
tr.getTransferData(DataFlavor.stringFlavor);
setLabel(s);
}
catch (UnsupportedFlavorException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
};
dt.install(this.label);
}
void setLabel(String s) { this.label.setText(s); }
}
public static class BeanSourcePanel extends BorderPanel {
final private JLabel label;
final private Random randomizer;
private SampleBean x;
public BeanSourcePanel(
String title, ScheduledExecutorService scheduler)
{
super(title);
this.label = new JLabel(" ");
this.randomizer = new Random();
add(this.label);
scheduler.scheduleAtFixedRate(new Runnable()
{ public void run() { changeBean(); } },
0, 1000, TimeUnit.MILLISECONDS);
(new SimpleDragSource("RandomBean"){
@Override public Transferable prepareTransferable() {
return new BeanTransferable(getBean());
}
}).install(this.label);
}
public SampleBean getBean() { return this.x; }
void changeBean()
{
this.x = SampleBean.randomBean(this.randomizer);
this.label.setText(this.x.toString());
}
}
public static class DNDQFrame extends JFrame
{
public DNDQFrame(String title, ScheduledExecutorService scheduler)
{
setTitle(title);
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
add(new JLabel("Drag and Drop Question"));
add(new BeanSourcePanel("drag source 1", scheduler));
add(new BeanLabelPanel("drop target 1"));
add(new BeanTablePanel("drop target 2"));
}
@Override public Component add(Component component)
{
if (component instanceof JComponent)
((JComponent) component).setAlignmentX(0.0f);
return super.add(component);
}
}
static public void main(String[] args)
{
ScheduledExecutorService scheduler =
new ScheduledThreadPoolExecutor(1);
DNDQFrame frame = new DNDQFrame("DragAndDropQuestion", scheduler);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
最佳答案
将放置监听器添加到 JScrollPane 中。您已经嵌套了表,因此它没有接收事件。另外,在 addBean() 方法中,您应该添加 table.revalidate() ,否则它不会在表模型中显示更新的数据。
关于java/swing : drag and drop problems with two child windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230033/
我正在开发一个摆动程序以显示多张图片。并且可以旋转图片(每个图片都以JComponent实现)。 问题是,当图片旋转时,JComponent的边框不会改变,因此图片会被剪切。 有什么办法也可以旋转边框
我有一个 JPanel 和一个 JButton 向量,我想将每个按钮添加到面板。 我遇到的问题是我有一个代表按钮向量的变量 btns,但宏函数只是将它视为一个符号,而不是一个向量。有没有办法以某种方式
我有一个 swing 应用程序,它覆盖 javax.swing.text.Document 以将基础文档的内容限制为某些字符和文本长度。我想将我的应用程序移植到 Javafx,但我不知道此类是否有 J
我有一个带有面板的简单应用程序,我想在单击它时暂停并重新开始绘画。 object ModulusPatterns extends SimpleSwingApplication { var dela
我似乎无法在 Swing 中强制布局。我有一个 JComponent添加到 JLayeredPane我在 JComponent 上设置了边框.然后,我想立即重新绘制所有内容 - 而不是像 invali
我有一个 Swing 应用程序,我想通过将外部文件从 Windows 资源管理器拖到应用程序上来导入外部文件。我有这个基本功能工作。但是,我想将默认的拖放光标图标更改为应用程序适当的光标。当鼠标键被按
我想在我的 Scala 摆动应用程序中使用一棵树,但该组件在 API 中不可用。 是否包装了 JTree存在吗? 如果没有,你对制作有什么建议吗? 谢谢 最佳答案 即使您可以在 Scala 程序中直接
我目前正在努力使我的 Swing 应用程序看起来更好。我想在这些方面实现一些目标: 这个想法是让每个框都有一个漂亮的标题,背景类似于上图。使用基本的 Swing 组件,我能得到的最接近的东西是添加 T
这是我在 Scala 中使用 Swing 的第一次实验,并且对下面的代码有一些疑问。它所做的只是生成一个带有可改变颜色的彩色矩形的窗口。请随时回答一个或任何一个问题。 1) 我在下面使用了 Java
一个愚蠢的问题,但我真的无法让它起作用:我在 Swing 应用程序中有一些长时间运行的过程,可能需要几分钟。我想在此过程进行时向用户显示进度对话框。我还想阻止用户执行进一步的操作,例如在进程进行时按下
如何获取秋千组件的默认背景色?我的意思是JPanel的默认背景色? 最佳答案 要获取创建面板时将使用的 DEFAULT 颜色,请使用: Color color = UIManager.getColor
我想更改特定表头的背景颜色。在我的应用程序中,我必须将当前月份的标题颜色设置为红色。 我的代码在这里:: jTable1.getTableHeader(). setDefaultRe
我正在努力使在 Java3D Canvas 上显示 Java Swing 组件并与之交互成为可能。我通过将透明 JPanel 绘制到缓冲图像来显示组件,然后使用 J3DGraphics2D 在 Can
嗨 当我在 swing 中创建按钮时,它会在文本周围添加边框,从而使按钮变大一点。 现在,我确实需要那个屏幕空间,我通常做的是创建一个文本项(禁用),它创建更小的组件大小(文本周围更小的空间)并向其添
有scala.swing.BoxPanel,但它似乎没有捕获重点,因为没有与javax.swing.Box工厂方法createHorizontalStrut等效的东西、createHorizo
我的 scala swing 应用程序中有一个 BoxPanel 按钮,这对我来说很难看,因为按钮的大小各不相同。我已将其更改为 GridPanel,但随后它们也垂直填充了面板,我发现这更难看。我怎样
我刚开始学习 Scala,作为学习过程的一部分,我一直在尝试使用 Swing 编写一些简单的脚本。 这是一个非常精简的例子,它展示了我所看到的问题。 SimpleSwingApp: import sc
我刚刚开始使用 clojure 和跷跷板制作 GUI 应用程序。它只创建一个 JFrame 和几个组件。这是代码。 main 函数除了调用 start-gui 什么也不做并在返回后立即退出。 (ns
Scala 是一种很棒的语言,但不幸的是缺少库文档。如何更改组件的初始大小?我什么都没有(故意),但无论如何都希望它是一定的。我目前有 ... contents = new BoxPanel(Orie
基本设置是这样的:我有一个垂直的 JSplitPane,我希望它有一个固定大小的底部组件和一个调整大小的顶部组件,我通过调用 setResizeWeight(1.0) 来完成。在此应用程序中,有一个按
我是一名优秀的程序员,十分优秀!