在本文中,我们将给您介绍关于如何在Swing中实现动态GUI的详细内容,并且为您解答swing如何实现动态界面的相关问题,此外,我们还将为您提供关于ios–如何在Swift中实现UIPageContr
在本文中,我们将给您介绍关于如何在Swing中实现动态GUI的详细内容,并且为您解答swing如何实现动态界面的相关问题,此外,我们还将为您提供关于ios – 如何在Swift中实现UIPageControl、ios – 如何在Swift中实现范围滑块、java GUI编程(swing)之六swing中放置图片、java swing中实现拖拽功能示例的知识。
本文目录一览:- 如何在Swing中实现动态GUI(swing如何实现动态界面)
- ios – 如何在Swift中实现UIPageControl
- ios – 如何在Swift中实现范围滑块
- java GUI编程(swing)之六swing中放置图片
- java 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
在我的应用程序中,我有我的主要UIViewController,一个透明的子视图,但是从屏幕底部滑入,然后是滑动子视图的4个子视图,这些子视图都是工作的UIScrollViews.我有分页启用,它的工作非常好,但我想为他们每个添加一个UIPageControl.我认真地无法掌握代表以及如何实施swift.任何帮助将不胜感激!
此外,我以编程方式进行此操作,所以不需要IB.很高兴提供代码,如果它有帮助.谢谢
解决方法
您可能需要添加到您的项目的行是:
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中实现范围滑块
但是当我使用它时,滑块根本不会出现.难道也是因为它都是用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 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中实现动态GUI和swing如何实现动态界面的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ios – 如何在Swift中实现UIPageControl、ios – 如何在Swift中实现范围滑块、java GUI编程(swing)之六swing中放置图片、java swing中实现拖拽功能示例等相关知识的信息别忘了在本站进行查找喔。
本文标签: