我正在学习本教程中的示例。根据教程,我想在两个选项卡之间拖动选项卡。到目前为止,我设法创建了这段代码,但我需要一些帮助才能完成代码。
来源
tabPane = new TabPane();
Tab tabA = new Tab();
Label tabALabel = new Label("Main Component");
tabPane.setOnDragDetected(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
/* drag was detected, start drag-and-drop gesture*/
System.out.println("onDragDetected");
/* allow any transfer mode */
Dragboard db = tabPane.startDragAndDrop(TransferMode.ANY);
/* put a string on dragboard */
ClipboardContent content = new ClipboardContent();
content.put(DataFormat.PLAIN_TEXT, tabPane);
db.setContent(content);
event.consume();
}
});
将选项卡的内容作为对象插入的正确方法是什么?简单的文本被转移到教程中。我必须如何修改这行< code>content.put(DataFormat。PLAIN_TEXT,tab pane);?
拖动选项卡后插入选项卡的正确方法是什么:
目的地
tabPane.setOnDragDropped(new EventHandler<DragEvent>()
{
@Override
public void handle(DragEvent event)
{
/* data dropped */
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString())
{
//tabPane.setText(db.getString());
Tab tabC = new Tab();
tabPane.getTabs().add(tabC);
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
}
});
我想这个转移可以完成吗?
工作溶液:
import java.util.Random;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class client extends Application
{
private static final String TAB_DRAG_KEY = "tab";
private ObjectProperty<Tab> draggingTab;
@Override
public void start(Stage primaryStage)
{
draggingTab = new SimpleObjectProperty<>();
TabPane tabPane1 = createTabPane();
TabPane tabPane2 = createTabPane();
VBox root = new VBox(10);
root.getChildren().addAll(tabPane1, tabPane2);
final Random rng = new Random();
for (int i = 1; i <= 8; i++)
{
final Tab tab = createTab("Tab " + i);
final StackPane pane = new StackPane();
int red = rng.nextInt(256);
int green = rng.nextInt(256);
int blue = rng.nextInt(256);
String style = String.format("-fx-background-color: rgb(%d, %d, %d);", red, green, blue);
pane.setStyle(style);
final Label label = new Label("This is tab " + i);
label.setStyle(String.format("-fx-text-fill: rgb(%d, %d, %d);", 256 - red, 256 - green, 256 - blue));
pane.getChildren().add(label);
pane.setMinWidth(600);
pane.setMinHeight(250);
tab.setContent(pane);
if (i <= 4)
{
tabPane1.getTabs().add(tab);
}
else
{
tabPane2.getTabs().add(tab);
}
}
primaryStage.setScene(new Scene(root, 600, 600));
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
private TabPane createTabPane()
{
final TabPane tabPane = new TabPane();
tabPane.setOnDragOver(new EventHandler<DragEvent>()
{
@Override
public void handle(DragEvent event)
{
final Dragboard dragboard = event.getDragboard();
if (dragboard.hasString()
&& TAB_DRAG_KEY.equals(dragboard.getString())
&& draggingTab.get() != null
&& draggingTab.get().getTabPane() != tabPane)
{
event.acceptTransferModes(TransferMode.MOVE);
event.consume();
}
}
});
tabPane.setOnDragDropped(new EventHandler<DragEvent>()
{
@Override
public void handle(DragEvent event)
{
final Dragboard dragboard = event.getDragboard();
if (dragboard.hasString()
&& TAB_DRAG_KEY.equals(dragboard.getString())
&& draggingTab.get() != null
&& draggingTab.get().getTabPane() != tabPane)
{
final Tab tab = draggingTab.get();
tab.getTabPane().getTabs().remove(tab);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);
event.setDropCompleted(true);
draggingTab.set(null);
event.consume();
}
}
});
return tabPane;
}
private Tab createTab(String text)
{
final Tab tab = new Tab();
final Label label = new Label(text);
tab.setGraphic(label);
label.setOnDragDetected(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
Dragboard dragboard = label.startDragAndDrop(TransferMode.MOVE);
ClipboardContent clipboardContent = new ClipboardContent();
clipboardContent.putString(TAB_DRAG_KEY);
dragboard.setContent(clipboardContent);
draggingTab.set(tab);
event.consume();
}
});
return tab;
}
}
这是我为此编写的代码。包括实现拖动移动机制的驱动程序和侦听器。
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
public class MovableTabbedPane extends JTabbedPane {
private MovableTabbedPane movableTabbedPane;
public MovableTabbedPane() {
super();
movableTabbedPane = this;
TabDragListener tabDragger = new TabDragListener();
this.addMouseListener(tabDragger);
this.addMouseMotionListener(tabDragger);
}
private class TabDragListener implements MouseListener, MouseMotionListener {
Point p0;
double y0, y;
Component current;
String title;
public void mousePressed(MouseEvent e) {
p0 = e.getPoint();
y0=p0.getY();
for (int i = 0; i < getTabCount(); i++) {
Rectangle bounds = getBoundsAt(i);
if (bounds.contains(p0)) {
current = MovableTabbedPane.this.getComponentAt(i);
title =MovableTabbedPane.this.getTitleAt(i);
}
}
};
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
y=p.getY();
if (current != null) {
// check for a significant horizontal drag
if(Math.abs(y-y0)< 40 && p.distance(p0)>5){
int targetIndex = MovableTabbedPane.this.getUI().tabForCoordinate(MovableTabbedPane.this,
e.getX(), e.getY());
// target index should be valid and also not be same as original tab's index
if(targetIndex!=-1 && targetIndex!=getSelectedIndex()){
movableTabbedPane.remove(current);
movableTabbedPane.insertTab(title, null, current, null, targetIndex);
setSelectedIndex(targetIndex);
}
}
}
}
public void mouseMoved(MouseEvent arg0) {}
public void mouseClicked(MouseEvent arg0) {}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {
current=null;
title =null;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
MovableTabbedPane pane = new MovableTabbedPane();
pane.add(new JTree(), "Tree 0");
pane.add(new JTextArea(" Hello"), "Tree 1");
pane.add(new JFileChooser(), "Tree 2");
pane.add(new JSpinner(), "Tree 3");
pane.add(new JSlider(),"Tree 4");
frame.getContentPane().add(pane);
frame.setBounds(100, 100, 400, 400);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
}
}
非常感谢,它基本上运行良好。但是,当从第二个选项卡拖到第一个/上部选项卡时,选项卡的内容不会被刷新,您需要更改选项卡或移动拆分分隔符。第二个/下部选项卡确实总是正确刷新。到目前为止,我还没有找到解决这个问题的方法,要求选项卡进行刷新不起作用。如果我能找到解决办法,我将不胜感激。
编辑:找到一个可行的解决方案
在setOnDragDropped事件处理程序中,我注释了选择添加的选项卡的行,然后添加了以下代码:
Platform.runLater(new Runnable() {
@Override
public void run() {
tabPane.getSelectionModel().select(tab) ;
}
});
现在有用了。再次感谢。
编辑2:我很抱歉我不得不报告它有时/大部分时间都有效,但并非总是如此。仍在调查如何真正修复它。
编辑3:至少现在我知道导致问题的原因:当一个选项卡被删除并添加到另一个窗格时,从旧选项卡中删除不是即时的,然后旧窗格禁用该选项卡的上下文的更新,该选项卡现在已经在另一个选项卡中。这就是为什么它根本没有被绘制。当我在删除和添加的调用之间放置Thread.sleep(500)(较短的睡眠时间不起作用)时,一切正常。如果我设法找到解决方案,稍后会更新。
我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS上)而不留下痕迹。有几种解决办法: 使用窗口对象 邮件后传 Cookies 本地存储 第一种可能是最糟糕的解决方案--你需要从你当前的窗口打开一个窗口,然后你只能在保持窗口打开的情况下进行交流。如果您在任何窗口中重新加载该页,则很可能会丢失通信。 第二种方法,使用postMessage,可能可以实现跨源通
当我像下面的例子一样点击选项卡2时,我如何将选项卡1 Neumorphic css翻译成选项卡2呢,就像从选项卡1滑到选项卡2一样? https://dribble.com/shots/10805627-neumorphic-tab
两个tab <div class="ui-tab "> <ul class="ui-tab-nav ui-border-b "> <li class="current"><span>热门</span></li> <li><span>热门</span></li> </ul> <ul class="ui-tab-content" sty
打开选项卡 打开新选项卡于 设置新的弹出窗口如何打开: 选项 描述 最后打开选项卡的窗口 在最后打开的窗口打开一个新的选项卡。 新窗口 打开一个新的窗口。 允许重复打开相同的对象 如果你想允许一个对象可打开多个实例,可勾选这个选项。 选项卡列样式 永远显示选项卡栏 打开窗口时显示标签栏。
打开新选项卡于 设置新的弹出窗口如何打开: 选项 描述 主窗口 在主窗口中打开一个新的选项卡。 最后打开选项卡的窗口 在最后打开的窗口打开一个新的选项卡。如果没有任何已打开的窗口,会打开一个新的窗口。 新窗口 打开一个新的窗口。 启动画面 控制在启动 Navicat 时出现哪些选项卡: 选项 描述 仅打开对象选项卡 仅打开对象选项卡,没有其他选项卡。 从上次离开的画面继续 打开对象选项卡,并重新打
启动画面 控制在启动 Navicat 时出现哪些选项卡: 选项 描述 仅打开对象选项卡 仅打开对象选项卡,没有其他选项卡。 从上次离开的画面继续 打开对象选项卡,并重新打开你上次离开 Navicat 时已打开的相同选项卡。 打开特定选项卡或一组选项卡 打开对象选项卡,并打开你在“设置选项卡”选择的选项卡。 打开选项卡 打开新选项卡于 设置新的弹出窗口如何打开: 选项 描述 主窗口 在主窗口中打开一