gpt4 book ai didi

java - 如何添加华丽的过渡箭头?

转载 作者:行者123 更新时间:2023-11-30 09:46:23 24 4
gpt4 key购买 nike

我有一个包含内容的 JPanel,我想用箭头包围它,这样当您单击其中一个时,jpanel 会发生变化(变为另一个)。我已经习惯了这种 UI 模式/习惯用法,我想是在 Flash 中,但再也找不到了。通常点击箭头周围也有点击箭头的效果,选中时会闪烁。

问题:1. 即使在 Flash 中,有任何例子可以引用我所说的内容吗?2. 知道用 Java 做这件事的库吗?也许使用 JavaFX?3. 示例应用/代码?

Sketch of the arrows surrounding a content area/photo to change

最佳答案

这可以用普通的 Swing 来完成。

建议:

  1. 使用CardLayout便于容器切换
  2. 使用BasicArrowButton用于方向按钮

我会提供一个 SSCCE不久。同时,另请参阅:


这是一个相当冗长的 SSCCE:

public final class SwingTransitionDemo {
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
}

private static void createAndShowGUI(){
final JFrame frame = new JFrame("Swing Transition Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(JMainPane.newInstance());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private static final class JMainPane extends JPanel{
private static final int PAD = 5;

private JMainPane(){
super(new GridBagLayout());
setBackground(Color.PINK);
GridBagConstraints c = new GridBagConstraints();

// Create north button
c.gridx = 1;
c.gridy = 0;
c.insets = new Insets(PAD, 0, PAD, 0);
c.fill = GridBagConstraints.HORIZONTAL;
final BasicArrowButton north = new BasicArrowButton(BasicArrowButton.NORTH);
north.addActionListener(BasicArrowButtonActionListener.getInstance());
add(north, c);

// Create west button
c.gridx = 0;
c.gridy = 1;
c.insets = new Insets(0, PAD, 0, PAD);
c.fill = GridBagConstraints.VERTICAL;
final BasicArrowButton west = new BasicArrowButton(BasicArrowButton.WEST);
west.addActionListener(BasicArrowButtonActionListener.getInstance());
add(west, c);

c.gridx = 1;
c.gridy = 1;
c.fill = GridBagConstraints.VERTICAL;
add(JCardPane.getInstance(), c);

// Create east button
c.gridx = 2;
c.gridy = 1;
c.insets = new Insets(0, PAD, 0, PAD);
c.fill = GridBagConstraints.VERTICAL;
final BasicArrowButton east = new BasicArrowButton(BasicArrowButton.EAST);
east.addActionListener(BasicArrowButtonActionListener.getInstance());
add(east, c);

// Create south button
c.gridx = 1;
c.gridy = 2;
c.insets = new Insets(PAD, 0, PAD, 0);
c.fill = GridBagConstraints.HORIZONTAL;
final BasicArrowButton south = new BasicArrowButton(BasicArrowButton.SOUTH);
south.addActionListener(BasicArrowButtonActionListener.getInstance());
add(south, c);
}

public static final JMainPane newInstance(){
return new JMainPane();
}

private static final class JCardPane extends JPanel{
private static JCardPane INSTANCE;

private JCardPane(){
super(new CardLayout());
setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(Box.createRigidArea(new Dimension(200, 200)), "");
add(Card.newInstance(Color.RED, "North"), String.valueOf(BasicArrowButton.NORTH));
add(Card.newInstance(Color.ORANGE, "WEST"), String.valueOf(BasicArrowButton.WEST));
add(Card.newInstance(Color.CYAN, "SOUTH"), String.valueOf(BasicArrowButton.SOUTH));
add(Card.newInstance(Color.GREEN, "EAST"), String.valueOf(BasicArrowButton.EAST));
}

public static final JCardPane getInstance(){
if(INSTANCE == null){
INSTANCE = new JCardPane();
}

return INSTANCE;
}

@Override
public Dimension getPreferredSize(){
return new Dimension(200, 200); // for demonstration purposes only
}

private static final class Card extends JPanel{
private Card(final Color c, final String s){
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBackground(c);

// Create components
add(Box.createVerticalGlue());
final JLabel label = new JLabel(s);
label.setAlignmentX(CENTER_ALIGNMENT);
add(label);
add(Box.createVerticalGlue());
}

public static final Card newInstance(final Color c, final String s){
return new Card(c, s);
}
}
}

private static final class BasicArrowButtonActionListener implements ActionListener{
private static BasicArrowButtonActionListener INSTANCE;

private BasicArrowButtonActionListener(){} // prevent external instantiation

public static final BasicArrowButtonActionListener getInstance(){
if(INSTANCE == null){
INSTANCE = new BasicArrowButtonActionListener();
}

return INSTANCE;
}

@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)JCardPane.getInstance().getLayout();
cl.show(JCardPane.getInstance(), String.valueOf((((BasicArrowButton)e.getSource()).getDirection())));
}
}
}
}

初始显示

enter image description here

如果您点击“南”方向箭头...

enter image description here

这使用了各种布局,包括 GridBagLayout , BoxLayoutCardLayout。请记住,此代码的大部分只是填充物。试一试它,让我知道它是否在球场上!

另见:

关于java - 如何添加华丽的过渡箭头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com