GVKun编程网logo

如何在Swing中实现动态GUI(swing如何实现动态界面)

10

在本文中,我们将给您介绍关于如何在Swing中实现动态GUI的详细内容,并且为您解答swing如何实现动态界面的相关问题,此外,我们还将为您提供关于ios–如何在Swift中实现UIPageContr

在本文中,我们将给您介绍关于如何在Swing中实现动态GUI的详细内容,并且为您解答swing如何实现动态界面的相关问题,此外,我们还将为您提供关于ios – 如何在Swift中实现UIPageControl、ios – 如何在Swift中实现范围滑块、java GUI编程(swing)之六swing中放置图片、java swing中实现拖拽功能示例的知识。

本文目录一览:

如何在Swing中实现动态GUI(swing如何实现动态界面)

如何在Swing中实现动态GUI(swing如何实现动态界面)

首先,为发布一些过分具体的内容而道歉,但是我对Swing并不十分了解,并且似乎找不到适合我需求的好例子。

因此,我试图找出实现动态GUI以便在Swing中选择过滤条件的最佳方法:

要实现的GUI样机

基础模型是一个类,其中包含可否定(例如,使用NOT前缀)条件的列表,以及指示这些条件应与AND还是OR组合的属性。

GUI将允许用户添加,更改或删除条件,并选择组合运算符(和/或)。第一个条件自然不会具有组合选择器,而第三个条件和后续条件将仅使用与第二个条件相同的组合操作符。

右侧的X按钮将用于删除条件。当按下添加按钮时,新的组件行将被添加到底部。进行更改时,这些更改将反映在基础模型中。

当然,我可以通过简单地将组件添加到JPanel然后相应地更新模型来“非常原始地”实现此功能,但是我更喜欢更整洁的解决方案,例如TableModel提供的解决方案。

因此,我想知道带有自定义TableModel和TableCellRenderer / Editor的表是否是最佳方法,或者是否有更好的方法来实现类似的方法。如果table确实是最好的方法,我将对使用TableCellRenderers或-Editors如何完成此工作的一些指示表示赞赏。

提前致谢。

答案1

小编典典

仅作为示例,所有内容都经过硬编码,以更好地理解

编辑:

正如kleopatra所注意到的那样,将JTable#fireTableDataChanged()从ActionListener移到了TableModel,修改了所有ClassName以lowerCase开头

`import java.awt.;
import java.awt.event.
;
import java.util.EventObject;
import javax.swing.;
import javax.swing.table.
;

public class ComponentTableTest {

private JFrame frame;private JTable CompTable = null;private CompTableModel CompModel = null;private JButton addButton = null;public static void main(String args[]) {    SwingUtilities.invokeLater(new Runnable() {        @Override        public void run() {            new ComponentTableTest().makeUI();        }    });}public void makeUI() {    CompTable = CreateCompTable();    JScrollPane CompTableScrollpane = new JScrollPane(CompTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);    JPanel bottomPanel = CreateBottomPanel();    frame = new JFrame("Comp Table Test");    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.add(CompTableScrollpane, BorderLayout.CENTER);    frame.add(bottomPanel, BorderLayout.SOUTH);    frame.setPreferredSize(new Dimension(800, 400));    frame.setLocation(150, 150);    frame.pack();    frame.setVisible(true);}public JTable CreateCompTable() {    CompModel = new CompTableModel();    CompModel.addRow();    JTable table = new JTable(CompModel);    table.setRowHeight(new CompCellPanel().getPreferredSize().height);    table.setTableHeader(null);    CompCellEditorRenderer compCellEditorRenderer = new CompCellEditorRenderer();    table.setDefaultRenderer(Object.class, compCellEditorRenderer);    table.setDefaultEditor(Object.class, compCellEditorRenderer);    return table;}public JPanel CreateBottomPanel() {    addButton = new JButton("Add Comp");    addButton.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent ae) {            Object source = ae.getSource();            if (source == addButton) {                CompModel.addRow();                //CompModel.fireTableDataChanged(); // moved to TableModel            }        }    });    JPanel panel = new JPanel(new GridBagLayout());    panel.add(addButton);    return panel;}

}

class CompCellEditorRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {

private static final long serialVersionUID = 1L;private CompCellPanel renderer = new CompCellPanel();private CompCellPanel editor = new CompCellPanel();@Overridepublic Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {    renderer.setComp((Comp) value);    return renderer;}@Overridepublic Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {    editor.setComp((Comp) value);    return editor;}@Overridepublic Object getCellEditorValue() {    return editor.getComp();}@Overridepublic boolean isCellEditable(EventObject anEvent) {    return true;}@Overridepublic boolean shouldSelectCell(EventObject anEvent) {    return false;}

}

class CompTableModel extends DefaultTableModel {

private static final long serialVersionUID = 1L;@Overridepublic int getColumnCount() {    return 1;}public void addRow() {    super.addRow(new Object[]{new Comp(0, 0, "", "")});    //super.fireTableDataChanged();}

}

class Comp {

int type;int relation;String lower;String upper;public Comp(int type, int relation, String lower, String upper) {    this.type = type;    this.relation = relation;    this.lower = lower;    this.upper = upper;}

}

class CompCellPanel extends JPanel {

private static final long serialVersionUID = 1L;private JLabel labelWith = new JLabel("With ");private JComboBox typeCombo = new JComboBox(new Object[]{"height", "length", "volume"});private JComboBox relationCombo = new JComboBox(new Object[]{"above", "below", "between"});private JTextField lowerField = new JTextField();private JLabel labelAnd = new JLabel(" and ");private JTextField upperField = new JTextField();private JButton removeButton = new JButton("remove");CompCellPanel() {    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));    relationCombo.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            enableUpper(relationCombo.getSelectedIndex() == 2);        }    });    enableUpper(false);    removeButton.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            JTable table = (JTable) SwingUtilities.getAncestorOfClass(JTable.class, (Component) e.getSource());            int row = table.getEditingRow();            table.getCellEditor().stopCellEditing();            ((DefaultTableModel) table.getModel()).removeRow(row);        }    });    add(labelWith);    add(typeCombo);    add(relationCombo);    add(lowerField);    add(labelAnd);    add(upperField);    add(Box.createHorizontalStrut(100));    add(removeButton);}private void enableUpper(boolean enable) {    labelAnd.setEnabled(enable);    upperField.setEnabled(enable);}public void setComp(Comp Comp) {    typeCombo.setSelectedIndex(Comp.type);    relationCombo.setSelectedIndex(Comp.relation);    lowerField.setText(Comp.lower);    upperField.setText(Comp.upper);    enableUpper(Comp.relation == 2);}public Comp getComp() {    return new Comp(typeCombo.getSelectedIndex(), relationCombo.getSelectedIndex(), lowerField.getText(), upperField.getText());}

}`

ios – 如何在Swift中实现UIPageControl

ios – 如何在Swift中实现UIPageControl

好的,所以我在这里奋斗,找不到一个工作的解决方案.我自己学习 Swift没有Objective C的经验(我知道,我知道).

在我的应用程序中,我有我的主要UIViewController,一个透明的子视图,但是从屏幕底部滑入,然后是滑动子视图的4个子视图,这些子视图都是工作的UIScrollViews.我有分页启用,它的工作非常好,但我想为他们每个添加一个UIPageControl.我认真地无法掌握代表以及如何实施swift.任何帮助将不胜感激!

此外,我以编程方式进行此操作,所以不需要IB.很高兴提供代码,如果它有帮助.谢谢

解决方法

我想你和/或任何其他人寻找如何做到这一点会发现 this answer有帮助.代码示例使我能够在我的scrollview上创建一个页面控件指示符,这是第一次尝试这样做.我发现很清楚

您可能需要添加到您的项目的行是:

1:在您命名视图控制器类时,将uiscrollviewdelegate作为协议添加.

2:在类声明中创建一个pageControl变量.您将需要播放帧号,使其显示在您想要的位置.目前的数字让我在窗口的中间.
参考数字表示(指示器左上角的x位置,左上角的y坐标,页面指示器的宽度,页面指示器的高度)

var pageControl:UIPageControl = UIPageControl(frame:CGRectMake(50,300,200a))

>在viewDidLoad中添加以下行:

configurePageControl()

scrollView.delegate = self
>你需要在viewDidLoad之后添加两个方法.一个在viewDidLoad中调用

func configurePageControl() {
     self.pageControl.numberOfPages = <some reference to the number of pages>
     self.pageControl.currentPage = 0
     self.pageControl.tintColor = UIColor.redColor()
     self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
     self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()     
     self.view.addSubview(pageControl)
 }

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
    pageControl.currentPage = Int(pageNumber)
}

scrollView委托其实很简单.添加UIScollViewDelegate作为您的ViewController类将通过在类声明之后添加它来实现的协议:class YourClassName:uiscrollviewdelegate.然后在viewDidLoad()中,通过使用scrollView.delegate = self行将滚动视图的delegate属性分配给您的类来完成委托设置. (再次看到我链接的例子,如果你需要进一步澄清这些命令去哪里)

ios – 如何在Swift中实现范围滑块

ios – 如何在Swift中实现范围滑块

我正在尝试实现Range Slider,我使用了名为 NMRangeSlider的自定义控件.

但是当我使用它时,滑块根本不会出现.难道也是因为它都是用Objective-C编写的吗?

这就是我目前的实现方式:

var rangeSlider = NMRangeSlider(frame: CGRectMake(16,6,275,34))
rangeSlider.lowerValue = 0.54
rangeSlider.upperValue = 0.94
self.view.addSubview(rangeSlider)

解决方法

更新:

它没有向我展示,因为它全是白色的.所以解决方案,不使用任何其他框架并坚持使用这个 – 您需要为所有组件设置所有视图,然后它将显示良好:

我曾尝试在Swift中导入它,因为我之前在Objective-C代码中使用它,但没有任何运气.如果我正确设置了所有内容并将其添加到viewDidLoad()或viewDidAppear()中,则不会显示任何内容.但有一点值得一提 – 当我进入View Debug Hierarchy时,滑块实际上就在画布上:

但是在将其添加到视图之前,它根本没有使用我设置的所有颜色进行渲染.为了记录 – 这是我使用的代码:

override func viewDidAppear(animated: Bool) {
    var rangeSlider = NMRangeSlider(frame: CGRectMake(50,50,34))
    rangeSlider.lowerValue = 0.54
    rangeSlider.upperValue = 0.94

    let range = 10.0
    let onestep = 1.0 / range
    let minRange: Float = 0.05
    rangeSlider.minimumRange = minRange

    let bgImage = UIView(frame: rangeSlider.frame)
    bgImage.backgroundColor = .greenColor()
    rangeSlider.trackImage = bgImage.pb_takeSnapshot()

    let trackView = UIView(frame: CGRectMake(0,rangeSlider.frame.size.width,29))
    trackView.backgroundColor = .whiteColor()
    trackView.opaque = false
    trackView.alpha = 0.3
    rangeSlider.trackImage = UIImage(named: "")

    let lowerThumb = UIView(frame: CGRectMake(0,8,29))
    lowerThumb.backgroundColor = .whiteColor()
    let lowerThumbHigh = UIView(frame: CGRectMake(0,29))
    lowerThumbHigh.backgroundColor = UIColor.blueColor()

    rangeSlider.lowerHandleImagenormal = lowerThumb.pb_takeSnapshot()
    rangeSlider.lowerHandleImageHighlighted = lowerThumbHigh.pb_takeSnapshot()
    rangeSlider.upperHandleImagenormal = lowerThumb.pb_takeSnapshot()
    rangeSlider.upperHandleImageHighlighted = lowerThumbHigh.pb_takeSnapshot()

    self.view.addSubview(rangeSlider)

    self.view.backgroundColor = .lightGrayColor()
}

使用this question中提到的捕获UIVmage作为UIImage的方法:

extension UIView {
    func pb_takeSnapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(bounds.size,false,UIScreen.mainScreen().scale)
        drawViewHierarchyInRect(self.bounds,afterScreenUpdates: true)
        let image = UIGraphicsGetimageFromCurrentimageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

其他方案:

您也可以尝试使用sgwilly/RangeSlider,它是用Swift编写的,因此您甚至不需要桥接标题.

java GUI编程(swing)之六swing中放置图片

java GUI编程(swing)之六swing中放置图片

想要在图形界面中放置图片,需要使用到ImageIcon
 
 
上面的界面使用到了窗口拆分JSplitPane(属于容器类组件)。将窗口拆分成了两列。一列是JList, 里面输入
了一些文字,一列是JLable,上面放置了图片。布局采用的是BorderLayout
 
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSplitPane;
import javax.swing.JList;
import javax.swing.ImageIcon;
/**
* swing 实战窗口拆分
* Created by admin on 2017/7/10.
*/
public class JsplitPane extends JFrame{
private JSplitPane jSplitPane;
private JLabel jLabel;
private JList jList;
public static void main(String[] args){
JsplitPane jsplitPane = new JsplitPane();
}
 
public JsplitPane(){
String [] words = {"Java", "Python", "Golang"};
jLabel = new JLabel(new ImageIcon("D:\\image\\QQ图片20150507223217.jpg"));
jList = new JList(words);
// JSplitPane 拆分窗格,垂直拆分方式
jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jList, jLabel);
this.add(jSplitPane);
//设置JFrame属性
this.setTitle("工程");
this.setLocation(500, 250);
this.setSize(350, 200);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
 
 

java swing中实现拖拽功能示例

java swing中实现拖拽功能示例

java实现拖拽示例

Swing中实现拖拽功能,代码很简单,都有注释,自己看,运行效果如下图:

复制代码 代码如下:

package com;

import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;
import javax.swing.*;

/**
 * 最简单的Java拖拽代码示例
 * @author 刘显安
 * 2013年1月24日
 */
public class DragTest extends JFrame
{

    JPanel panel;//要接受拖拽的面板
    public Dragtest()
    {
        panel = new JPanel();
        panel.setBackground(Color.YELLOW);
        getContentPane().add(panel,BorderLayout.CENTER);
        setSize(500,200);
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(400,200);
        setTitle("最简单的拖拽示例:拖拽文件到下面(20130124)");
        drag();//启用拖拽
    }
    public static void main(String[] args) throws Exception
    {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");//设置皮肤
        new Dragtest().setVisible(true);;
    }
    public void drag()//定义的拖拽方法
    {
        //panel表示要接受拖拽的控件
        new DropTarget(panel,DnDConstants.ACTION_copY_OR_MOVE,new DropTargetAdapter()
        {
            @Override
            public void drop(DropTargetDropEvent dtde)//重写适配器的drop方法
            {
                try
                {
                    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor))//如果拖入的文件格式受支持
                    {
                        dtde.acceptDrop(DnDConstants.ACTION_copY_OR_MOVE);//接收拖拽来的数据
                        List<File> list =  (List<File>) (dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
                        String temp="";
                        for(File file:list)
                            temp+=file.getAbsolutePath()+";\n";
                        JOptionPane.showMessageDialog(null,temp);
                        dtde.dropComplete(true);//指示拖拽操作已完成
                    }
                    else
                    {
                        dtde.rejectDrop();//否则拒绝拖拽来的数据
                    }
                }
                catch (Exception e)
                {
                    e.printstacktrace();
                }
            }
        });
    }
}

关于如何在Swing中实现动态GUIswing如何实现动态界面的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ios – 如何在Swift中实现UIPageControl、ios – 如何在Swift中实现范围滑块、java GUI编程(swing)之六swing中放置图片、java swing中实现拖拽功能示例等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇如何使用绝对路径从Java运行Python文件?(java绝对路径怎么写)

下一篇如何在quartz作业中使用@Autowired?